td 0.10.31 → 0.10.32

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,4 +1,10 @@
1
1
 
2
+ == 2012-07-03 version 0.10.32
3
+
4
+ * Added table:partial_delete subcommand
5
+ * query, sched:create and sched:update subcommands support -P, --priority option
6
+
7
+
2
8
  == 2012-06-27 version 0.10.31
3
9
 
4
10
  * table:tail supports -P option which enable pretty printing
@@ -5,6 +5,27 @@ module Command
5
5
  # TODO
6
6
  JOB_WAIT_MAX_RETRY_COUNT_ON_NETWORK_ERROR = 10
7
7
 
8
+ PRIORITY_FORMAT_MAP = {
9
+ -2 => 'VERY LOW',
10
+ -1 => 'LOW',
11
+ 0 => 'NORMAL',
12
+ 1 => 'HIGH',
13
+ 2 => 'VERY HIGH',
14
+ }
15
+
16
+ PRIORITY_PARSE_MAP = {
17
+ /\Avery[ _\-]?low\z/i => -2,
18
+ /\A-2\z/ => -2,
19
+ /\Alow\z/i => -1,
20
+ /\A-1\z/ => -1,
21
+ /\Anorm(?:al)?\z/i => 0,
22
+ /\A[\-\+]?0\z/ => 0,
23
+ /\Ahigh\z/i => 1,
24
+ /\A[\+]?1\z/ => 1,
25
+ /\Avery[ _\-]?high\z/i => 2,
26
+ /\A[\+]?2\z/ => 2,
27
+ }
28
+
8
29
  def job_list(op)
9
30
  page = 0
10
31
  skip = 0
@@ -41,10 +62,11 @@ module Command
41
62
  jobs.each {|job|
42
63
  start = job.start_at
43
64
  elapsed = cmd_format_elapsed(start, job.end_at)
44
- rows << {:JobID => job.job_id, :Status => job.status, :Type => job.type, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Result => job.result_url}
65
+ priority = job_priority_name_of(job.priority)
66
+ rows << {:JobID => job.job_id, :Status => job.status, :Type => job.type, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Priority => priority, :Result => job.result_url}
45
67
  }
46
68
 
47
- puts cmd_render_table(rows, :fields => [:JobID, :Status, :Start, :Elapsed,:Result, :Type, :Query])
69
+ puts cmd_render_table(rows, :fields => [:JobID, :Status, :Start, :Elapsed, :Priority, :Result, :Type, :Query])
48
70
  end
49
71
 
50
72
  def job_show(op)
@@ -79,8 +101,9 @@ module Command
79
101
  #puts "URL : #{job.url}"
80
102
  puts "Status : #{job.status}"
81
103
  puts "Type : #{job.type}"
104
+ puts "Priority : #{job_priority_name_of(job.priority)}"
105
+ puts "Result : #{job.result_url}"
82
106
  puts "Query : #{job.query}"
83
- puts "Result table : #{job.result_url}"
84
107
 
85
108
  if wait && !job.finished?
86
109
  wait_job(job)
@@ -248,6 +271,17 @@ module Command
248
271
 
249
272
  puts cmd_render_table(rows, opts)
250
273
  end
274
+
275
+ def job_priority_name_of(id)
276
+ PRIORITY_FORMAT_MAP[id] || 'NORMAL'
277
+ end
278
+
279
+ def job_priority_id_of(name)
280
+ PRIORITY_PARSE_MAP.each_pair {|pattern,id|
281
+ return id if pattern.match(name)
282
+ }
283
+ return nil
284
+ end
251
285
  end
252
286
  end
253
287
 
@@ -223,6 +223,7 @@ module List
223
223
  add_list 'table:import', %w[db table files_], 'Parse and import files to a table', 'table:import example_db table1 --apache access.log', 'table:import example_db table1 --json -t time - < test.json'
224
224
  add_list 'table:export', %w[db table], 'Dump logs in a table to the specified storage', 'table:export example_db table1 --s3-bucket mybucket -k KEY_ID -s SECRET_KEY'
225
225
  add_list 'table:tail', %w[db table], 'Get recently imported logs', 'table:tail example_db table1', 'table:tail example_db table1 -t "2011-01-02 03:04:05" -n 30'
226
+ add_list 'table:partial_delete', %w[db table], 'Delete logs from the table within the specified time range', 'table:partial_delete example_db table1 --from 1341000000 --to 1341003600'
226
227
 
227
228
  add_list 'bulk_import:list', %w[], 'List bulk import sessions', 'bulk_import:list'
228
229
  add_list 'bulk_import:show', %w[name], 'Show list of uploaded parts', 'bulk_import:show'
@@ -10,6 +10,7 @@ module Command
10
10
  result_url = nil
11
11
  result_user = nil
12
12
  result_ask_password = false
13
+ priority = nil
13
14
 
14
15
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
15
16
  db_name = s
@@ -35,6 +36,12 @@ module Command
35
36
  op.on('-p', '--password', 'ask password for the result URL') {|s|
36
37
  result_ask_password = true
37
38
  }
39
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
40
+ priority = job_priority_id_of(s)
41
+ unless priority
42
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
43
+ end
44
+ }
38
45
 
39
46
  sql = op.cmd_parse
40
47
 
@@ -53,7 +60,7 @@ module Command
53
60
  # local existance check
54
61
  get_database(client, db_name)
55
62
 
56
- job = client.query(db_name, sql, result_url)
63
+ job = client.query(db_name, sql, result_url, priority)
57
64
 
58
65
  $stderr.puts "Job #{job.job_id} is queued."
59
66
  $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
@@ -69,7 +76,7 @@ module Command
69
76
  end
70
77
  end
71
78
 
72
- require 'td/command/job' # wait_job
79
+ require 'td/command/job' # wait_job, job_priority_id_of
73
80
  end
74
81
  end
75
82
 
@@ -3,6 +3,8 @@ module TreasureData
3
3
  module Command
4
4
 
5
5
  def sched_list(op)
6
+ require 'td/command/job' # job_priority_name_of
7
+
6
8
  op.cmd_parse
7
9
 
8
10
  client = get_client
@@ -11,13 +13,13 @@ module Command
11
13
 
12
14
  rows = []
13
15
  scheds.each {|sched|
14
- rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Result => sched.result_url, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
16
+ rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Priority => job_priority_name_of(sched.priority), :Result => sched.result_url, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
15
17
  }
16
18
  rows = rows.sort_by {|map|
17
19
  map[:Name]
18
20
  }
19
21
 
20
- puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Result, :Database, :Query], :max_width=>500)
22
+ puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Priority, :Result, :Database, :Query], :max_width=>500)
21
23
  end
22
24
 
23
25
  def sched_create(op)
@@ -27,6 +29,7 @@ module Command
27
29
  result_url = nil
28
30
  result_user = nil
29
31
  result_ask_password = false
32
+ priority = nil
30
33
 
31
34
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
32
35
  db_name = s
@@ -46,6 +49,12 @@ module Command
46
49
  op.on('-p', '--password', 'ask password for the result URL') {|s|
47
50
  result_ask_password = true
48
51
  }
52
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
53
+ priority = job_priority_id_of(s)
54
+ unless priority
55
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
56
+ end
57
+ }
49
58
 
50
59
  name, cron, sql = op.cmd_parse
51
60
 
@@ -65,7 +74,7 @@ module Command
65
74
  get_database(client, db_name)
66
75
 
67
76
  begin
68
- first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result_url, :timezone=>timezone, :delay=>delay)
77
+ first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result_url, :timezone=>timezone, :delay=>delay, :priority=>priority)
69
78
  rescue AlreadyExistsError
70
79
  cmd_debug_error $!
71
80
  $stderr.puts "Schedule '#{name}' already exists."
@@ -99,6 +108,7 @@ module Command
99
108
  result = nil
100
109
  timezone = nil
101
110
  delay = nil
111
+ priority = nil
102
112
 
103
113
  op.on('-s', '--schedule CRON', 'change the schedule') {|s|
104
114
  cron = s
@@ -118,6 +128,12 @@ module Command
118
128
  op.on('-D', '--delay SECONDS', 'change the delay time of the schedule', Integer) {|i|
119
129
  delay = i
120
130
  }
131
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
132
+ priority = job_priority_id_of(s)
133
+ unless priority
134
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
135
+ end
136
+ }
121
137
 
122
138
  name = op.cmd_parse
123
139
 
@@ -128,6 +144,7 @@ module Command
128
144
  params['result'] = result if result
129
145
  params['timezone'] = timezone if timezone
130
146
  params['delay'] = delay.to_s if delay
147
+ params['priority'] = priority.to_s if priority
131
148
 
132
149
  if params.empty?
133
150
  $stderr.puts op.to_s
@@ -149,6 +166,8 @@ module Command
149
166
  end
150
167
 
151
168
  def sched_history(op)
169
+ require 'td/command/job' # job_priority_name_of
170
+
152
171
  page = 0
153
172
  skip = 0
154
173
 
@@ -186,16 +205,17 @@ module Command
186
205
  puts "Delay : #{s.delay} sec"
187
206
  puts "Next : #{s.next_time}"
188
207
  puts "Result : #{s.result_url}"
208
+ puts "Priority : #{job_priority_name_of(s.priority)}"
189
209
  puts "Database : #{s.database}"
190
210
  puts "Query : #{s.query}"
191
211
  end
192
212
 
193
213
  rows = []
194
214
  history.each {|j|
195
- rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Result=>j.result_url}
215
+ rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Priority => job_priority_name_of(j.priority), :Result=>j.result_url}
196
216
  }
197
217
 
198
- puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Result])
218
+ puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Priority, :Result])
199
219
  end
200
220
 
201
221
  def sched_run(op)
@@ -134,7 +134,7 @@ module Command
134
134
 
135
135
  op.on('-t', '--to TIME', 'end time of logs to get') {|s|
136
136
  if s.to_i.to_s == s
137
- to = s
137
+ to = s.to_i
138
138
  else
139
139
  require 'time'
140
140
  to = Time.parse(s).to_i
@@ -142,7 +142,7 @@ module Command
142
142
  }
143
143
  op.on('-f', '--from TIME', 'start time of logs to get') {|s|
144
144
  if s.to_i.to_s == s
145
- from = s
145
+ from = s.to_i
146
146
  else
147
147
  require 'time'
148
148
  from = Time.parse(s).to_i
@@ -193,7 +193,6 @@ module Command
193
193
  puts row.to_json
194
194
  }
195
195
  end
196
-
197
196
  end
198
197
 
199
198
  def table_export(op)
@@ -254,6 +253,64 @@ module Command
254
253
  end
255
254
  end
256
255
 
256
+ def table_partial_delete(op)
257
+ from = nil
258
+ to = nil
259
+ wait = false
260
+
261
+ op.on('-t', '--to TIME', 'end time of logs to delete') {|s|
262
+ if s.to_i.to_s == s
263
+ # UNIX time
264
+ to = s.to_i
265
+ else
266
+ require 'time'
267
+ to = Time.parse(s).to_i
268
+ end
269
+ }
270
+ op.on('-f', '--from TIME', 'start time of logs to delete') {|s|
271
+ if s.to_i.to_s == s
272
+ from = s.to_i
273
+ else
274
+ require 'time'
275
+ from = Time.parse(s).to_i
276
+ end
277
+ }
278
+ op.on('-w', '--wait', 'wait for finishing the job', TrueClass) {|b|
279
+ wait = b
280
+ }
281
+
282
+ db_name, table_name = op.cmd_parse
283
+
284
+ unless from
285
+ $stderr.puts "-f, --from TIME option is required"
286
+ exit 1
287
+ end
288
+
289
+ unless to
290
+ $stderr.puts "-t, --to TIME option is required"
291
+ exit 1
292
+ end
293
+
294
+ if from % 3600 != 0 || to % 3600 != 0
295
+ $stderr.puts "time must be a multiple of 3600 (1 hour)"
296
+ exit 1
297
+ end
298
+
299
+ client = get_client
300
+
301
+ table = get_table(client, db_name, table_name)
302
+
303
+ job = client.partial_delete(db_name, table_name, to, from)
304
+
305
+ $stderr.puts "Partial delete job #{job.job_id} is queued."
306
+ $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
307
+
308
+ if wait && !job.finished?
309
+ wait_job(job)
310
+ puts "Status : #{job.status}"
311
+ end
312
+ end
313
+
257
314
  require 'td/command/import' # table:import
258
315
  require 'td/command/export' # table:export
259
316
  require 'td/command/job' # wait_job
data/lib/td/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.10.31'
3
+ VERSION = '0.10.32'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.31
4
+ version: 0.10.32
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-27 00:00:00.000000000Z
12
+ date: 2012-07-03 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &70192621206960 !ruby/object:Gem::Requirement
16
+ requirement: &70143943515280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70192621206960
24
+ version_requirements: *70143943515280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70192621206320 !ruby/object:Gem::Requirement
27
+ requirement: &70143943514700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70192621206320
35
+ version_requirements: *70143943514700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hirb
38
- requirement: &70192621205780 !ruby/object:Gem::Requirement
38
+ requirement: &70143943514000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,21 +43,21 @@ dependencies:
43
43
  version: 0.4.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70192621205780
46
+ version_requirements: *70143943514000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: td-client
49
- requirement: &70192621205060 !ruby/object:Gem::Requirement
49
+ requirement: &70143943509200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.8.18
54
+ version: 0.8.19
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70192621205060
57
+ version_requirements: *70143943509200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: td-logger
60
- requirement: &70192621204380 !ruby/object:Gem::Requirement
60
+ requirement: &70143943508660 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.3.12
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70192621204380
68
+ version_requirements: *70143943508660
69
69
  description: CLI to manage data on Treasure Data, the Hadoop-based cloud data warehousing
70
70
  email: support@treasure-data.com
71
71
  executables: