mobilize-base 1.0.2 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/LICENSE.txt +202 -20
- data/README.md +219 -138
- data/Rakefile +1 -2
- data/lib/mobilize-base/extensions/google_drive/acl.rb +25 -0
- data/lib/mobilize-base/extensions/google_drive/client_login_fetcher.rb +49 -0
- data/lib/mobilize-base/extensions/google_drive/file.rb +80 -0
- data/lib/mobilize-base/extensions/{google_drive.rb → google_drive/worksheet.rb} +46 -173
- data/lib/mobilize-base/extensions/resque.rb +18 -24
- data/lib/mobilize-base/extensions/string.rb +12 -0
- data/lib/mobilize-base/handlers/gbook.rb +14 -47
- data/lib/mobilize-base/handlers/gdrive.rb +17 -18
- data/lib/mobilize-base/handlers/gfile.rb +18 -39
- data/lib/mobilize-base/handlers/gridfs.rb +43 -0
- data/lib/mobilize-base/handlers/gsheet.rb +48 -99
- data/lib/mobilize-base/jobtracker.rb +29 -15
- data/lib/mobilize-base/models/dataset.rb +33 -35
- data/lib/mobilize-base/models/job.rb +21 -168
- data/lib/mobilize-base/models/runner.rb +178 -0
- data/lib/mobilize-base/models/task.rb +137 -0
- data/lib/mobilize-base/models/user.rb +47 -0
- data/lib/mobilize-base/rakes.rb +59 -0
- data/lib/mobilize-base/version.rb +1 -1
- data/lib/mobilize-base.rb +20 -9
- data/lib/samples/gdrive.yml +12 -12
- data/lib/samples/gridfs.yml +9 -0
- data/lib/samples/gsheet.yml +6 -0
- data/lib/samples/jobtracker.yml +9 -9
- data/lib/samples/mongoid.yml +3 -3
- data/mobilize-base.gemspec +1 -1
- data/test/base1_task1.yml +3 -0
- data/test/base_job_rows.yml +13 -0
- data/test/mobilize-base_test.rb +59 -0
- metadata +20 -9
- data/lib/mobilize-base/handlers/mongodb.rb +0 -32
- data/lib/mobilize-base/models/requestor.rb +0 -232
- data/lib/mobilize-base/tasks.rb +0 -43
- data/test/mobilize_test.rb +0 -108
data/mobilize-base.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.homepage = ""
|
11
11
|
s.summary = %q{Moves datasets and schedules data transfers using MongoDB, Resque and Google Docs}
|
12
12
|
s.description = %q{Manage your organization's workflows entirely through Google Docs and irb.
|
13
|
-
Mobilize schedules jobs, queues workers, sends failure notifications, and
|
13
|
+
Mobilize schedules jobs, queues workers, sends failure notifications, and
|
14
14
|
integrates mobilize-hadoop, -http, -mysql, and -mongodb packages
|
15
15
|
to allow seamless transport of TSV and JSON data between any two endpoints. }
|
16
16
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
- name: "base1"
|
2
|
+
active: true
|
3
|
+
trigger: once
|
4
|
+
status: ""
|
5
|
+
task1: 'gsheet.read "Runner_mobilize(test)/base1_task1.in"'
|
6
|
+
task2: 'gsheet.write "base1/task1", "Runner_mobilize(test)/base1.out"'
|
7
|
+
|
8
|
+
- name: "base2"
|
9
|
+
active: true
|
10
|
+
trigger: "after base1"
|
11
|
+
status: ""
|
12
|
+
task1: 'gsheet.read "Runner_mobilize(test)/base1.out"'
|
13
|
+
task2: 'gsheet.write "task1", "Runner_mobilize(test)/base2.out"'
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe "Mobilize" do
|
4
|
+
|
5
|
+
def before
|
6
|
+
puts 'nothing before'
|
7
|
+
end
|
8
|
+
|
9
|
+
# enqueues 4 workers on Resque
|
10
|
+
it "runs integration test" do
|
11
|
+
|
12
|
+
puts "restart test redis"
|
13
|
+
Mobilize::Jobtracker.restart_test_redis
|
14
|
+
|
15
|
+
puts "clear out test db"
|
16
|
+
Mobilize::Jobtracker.drop_test_db
|
17
|
+
|
18
|
+
puts "restart workers"
|
19
|
+
Mobilize::Jobtracker.restart_workers!
|
20
|
+
|
21
|
+
puts "build test runner"
|
22
|
+
gdrive_slot = Mobilize::Gdrive.owner_email
|
23
|
+
puts "create user 'mobilize'"
|
24
|
+
user_name = gdrive_slot.split("@").first
|
25
|
+
u = Mobilize::User.find_or_create_by_name(user_name)
|
26
|
+
assert u.email == gdrive_slot
|
27
|
+
|
28
|
+
Mobilize::Jobtracker.build_test_runner(user_name)
|
29
|
+
assert Mobilize::Jobtracker.workers.length == Mobilize::Resque.config['max_workers'].to_i
|
30
|
+
|
31
|
+
puts "Jobtracker created runner with 'jobs' sheet?"
|
32
|
+
r = u.runner
|
33
|
+
jobs_sheet = r.gsheet(gdrive_slot)
|
34
|
+
tsv = jobs_sheet.to_tsv
|
35
|
+
assert tsv.length == 56 #headers only
|
36
|
+
|
37
|
+
puts "add base1_task1 input sheet"
|
38
|
+
test_source_sheet = Mobilize::Gsheet.find_or_create_by_path("#{r.path.split("/")[0..-2].join("/")}/base1_task1.in",gdrive_slot)
|
39
|
+
|
40
|
+
test_source_ha = ::YAML.load_file("#{Mobilize::Base.root}/test/base1_task1.yml")*40
|
41
|
+
test_source_tsv = test_source_ha.hash_array_to_tsv
|
42
|
+
test_source_sheet.write(test_source_tsv)
|
43
|
+
|
44
|
+
puts "add row to jobs sheet, wait 120s"
|
45
|
+
test_job_rows = ::YAML.load_file("#{Mobilize::Base.root}/test/base_job_rows.yml")
|
46
|
+
jobs_sheet.add_or_update_rows(test_job_rows)
|
47
|
+
|
48
|
+
puts "job row added, force enqueued runner"
|
49
|
+
r.enqueue!
|
50
|
+
sleep 120
|
51
|
+
|
52
|
+
puts "jobtracker posted test sheet data to test destination, and checksum succeeded?"
|
53
|
+
test_target_sheet = Mobilize::Gsheet.find_by_path("#{r.path.split("/")[0..-2].join("/")}/base1.out",gdrive_slot)
|
54
|
+
|
55
|
+
assert test_target_sheet.to_tsv == test_source_sheet.to_tsv
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobilize-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -189,7 +189,7 @@ dependencies:
|
|
189
189
|
version: 3.1.1
|
190
190
|
description: ! "Manage your organization's workflows entirely through Google Docs
|
191
191
|
and irb.\n Mobilize schedules jobs, queues workers, sends failure
|
192
|
-
notifications, and
|
192
|
+
notifications, and\n integrates mobilize-hadoop, -http, -mysql,
|
193
193
|
and -mongodb packages\n to allow seamless transport of TSV and
|
194
194
|
JSON data between any two endpoints. "
|
195
195
|
email:
|
@@ -205,7 +205,10 @@ files:
|
|
205
205
|
- Rakefile
|
206
206
|
- lib/mobilize-base.rb
|
207
207
|
- lib/mobilize-base/extensions/array.rb
|
208
|
-
- lib/mobilize-base/extensions/google_drive.rb
|
208
|
+
- lib/mobilize-base/extensions/google_drive/acl.rb
|
209
|
+
- lib/mobilize-base/extensions/google_drive/client_login_fetcher.rb
|
210
|
+
- lib/mobilize-base/extensions/google_drive/file.rb
|
211
|
+
- lib/mobilize-base/extensions/google_drive/worksheet.rb
|
209
212
|
- lib/mobilize-base/extensions/hash.rb
|
210
213
|
- lib/mobilize-base/extensions/object.rb
|
211
214
|
- lib/mobilize-base/extensions/resque.rb
|
@@ -214,21 +217,27 @@ files:
|
|
214
217
|
- lib/mobilize-base/handlers/gbook.rb
|
215
218
|
- lib/mobilize-base/handlers/gdrive.rb
|
216
219
|
- lib/mobilize-base/handlers/gfile.rb
|
220
|
+
- lib/mobilize-base/handlers/gridfs.rb
|
217
221
|
- lib/mobilize-base/handlers/gsheet.rb
|
218
|
-
- lib/mobilize-base/handlers/mongodb.rb
|
219
222
|
- lib/mobilize-base/jobtracker.rb
|
220
223
|
- lib/mobilize-base/models/dataset.rb
|
221
224
|
- lib/mobilize-base/models/job.rb
|
222
|
-
- lib/mobilize-base/models/
|
223
|
-
- lib/mobilize-base/
|
225
|
+
- lib/mobilize-base/models/runner.rb
|
226
|
+
- lib/mobilize-base/models/task.rb
|
227
|
+
- lib/mobilize-base/models/user.rb
|
228
|
+
- lib/mobilize-base/rakes.rb
|
224
229
|
- lib/mobilize-base/tasks/mobilize-base.rake
|
225
230
|
- lib/mobilize-base/version.rb
|
226
231
|
- lib/samples/gdrive.yml
|
232
|
+
- lib/samples/gridfs.yml
|
233
|
+
- lib/samples/gsheet.yml
|
227
234
|
- lib/samples/jobtracker.yml
|
228
235
|
- lib/samples/mongoid.yml
|
229
236
|
- lib/samples/resque.yml
|
230
237
|
- mobilize-base.gemspec
|
231
|
-
- test/
|
238
|
+
- test/base1_task1.yml
|
239
|
+
- test/base_job_rows.yml
|
240
|
+
- test/mobilize-base_test.rb
|
232
241
|
- test/redis-test.conf
|
233
242
|
- test/test_helper.rb
|
234
243
|
homepage: ''
|
@@ -257,7 +266,9 @@ specification_version: 3
|
|
257
266
|
summary: Moves datasets and schedules data transfers using MongoDB, Resque and Google
|
258
267
|
Docs
|
259
268
|
test_files:
|
260
|
-
- test/
|
269
|
+
- test/base1_task1.yml
|
270
|
+
- test/base_job_rows.yml
|
271
|
+
- test/mobilize-base_test.rb
|
261
272
|
- test/redis-test.conf
|
262
273
|
- test/test_helper.rb
|
263
274
|
has_rdoc:
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Mobilize
|
2
|
-
class Mongodb
|
3
|
-
|
4
|
-
def Mongodb.grid
|
5
|
-
session = ::Mongoid.configure.sessions['default']
|
6
|
-
database_name = session['database']
|
7
|
-
host,port = session['hosts'].first.split(":")
|
8
|
-
return ::Mongo::GridFileSystem.new(::Mongo::Connection.new(host,port).db(database_name))
|
9
|
-
end
|
10
|
-
|
11
|
-
def Mongodb.read_by_filename(filename)
|
12
|
-
begin
|
13
|
-
zs=Mongodb.grid.open(filename,'r').read
|
14
|
-
return ::Zlib::Inflate.inflate(zs)
|
15
|
-
rescue
|
16
|
-
"failed Mongo read for filename #{filename}".oputs
|
17
|
-
return nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def Mongodb.write_by_filename(filename,string)
|
22
|
-
zs = ::Zlib::Deflate.deflate(string)
|
23
|
-
Mongodb.grid.open(filename,'w',:delete_old => true){|f| f.write(zs)}
|
24
|
-
return true
|
25
|
-
end
|
26
|
-
|
27
|
-
def Mongodb.delete_by_filename(filename)
|
28
|
-
Mongodb.grid.delete(filename)
|
29
|
-
return true
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,232 +0,0 @@
|
|
1
|
-
module Mobilize
|
2
|
-
class Requestor
|
3
|
-
include Mongoid::Document
|
4
|
-
include Mongoid::Timestamps
|
5
|
-
field :email, type: String
|
6
|
-
field :oauth, type: String
|
7
|
-
field :name, type: String
|
8
|
-
field :first_name, type: String
|
9
|
-
field :last_name, type: String
|
10
|
-
field :admin_role, type: String
|
11
|
-
field :last_run, type: Time
|
12
|
-
field :status, type: String
|
13
|
-
|
14
|
-
validates_presence_of :name, :message => ' cannot be blank.'
|
15
|
-
validates_uniqueness_of :name, :message => ' has already been used.'
|
16
|
-
|
17
|
-
before_destroy :destroy_jobs
|
18
|
-
|
19
|
-
def Requestor.find_or_create_by_name(name)
|
20
|
-
r = Requestor.where(:name => name).first
|
21
|
-
r = Requestor.create(:name => name) unless r
|
22
|
-
return r
|
23
|
-
end
|
24
|
-
|
25
|
-
def Requestor.find_or_create_by_email(email)
|
26
|
-
r = Requestor.where(:email => email).first
|
27
|
-
r = Requestor.create(:email => email) unless r
|
28
|
-
user_name = email.split("@").first
|
29
|
-
r.update_attributes(:name => user_name) unless r.name.to_s.length>0
|
30
|
-
return r
|
31
|
-
end
|
32
|
-
|
33
|
-
def Requestor.jobs_sheet_headers
|
34
|
-
%w{name active schedule status last_error destination_url tasks datasets params destination}
|
35
|
-
end
|
36
|
-
|
37
|
-
def Requestor.perform(id,*args)
|
38
|
-
r = Requestor.find(id.to_s)
|
39
|
-
#reserve email account for read
|
40
|
-
gdrive_email = Gdrive.get_worker_email_by_mongo_id(id)
|
41
|
-
unless gdrive_email
|
42
|
-
"no gdrive_email available for #{r.name}".oputs
|
43
|
-
return false
|
44
|
-
end
|
45
|
-
jobs_sheet = r.jobs_sheet(gdrive_email)
|
46
|
-
#write headers to sheet
|
47
|
-
Requestor.jobs_sheet_headers.each_with_index do |h,h_i|
|
48
|
-
jobs_sheet[1,h_i+1] = h
|
49
|
-
end
|
50
|
-
jobs_sheet.save
|
51
|
-
#read the jobs sheet
|
52
|
-
#record jobs in DB
|
53
|
-
#deactivate jobs not in sheet
|
54
|
-
r.read_jobs(gdrive_email)
|
55
|
-
#queue up the jobs that are due and active
|
56
|
-
r.jobs.each do |j|
|
57
|
-
begin
|
58
|
-
if j.active and j.is_due?
|
59
|
-
#cache all datasets
|
60
|
-
j.dataset_array.each do |dst|
|
61
|
-
#read tsv, write to cache for job to use
|
62
|
-
tsv = Gsheet.find_or_create_by_name(dst.name,gdrive_email).to_tsv
|
63
|
-
r.update_status("caching #{dst.name}")
|
64
|
-
dst.write_cache(tsv)
|
65
|
-
end
|
66
|
-
j.enqueue!
|
67
|
-
end
|
68
|
-
rescue ScriptError,StandardError => exc
|
69
|
-
#update errors
|
70
|
-
j.update_attributes(:last_error=>exc.to_s,:last_trace=>exc.backtrace.to_s)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
#write any updates to status, error, datasource_url etc.
|
74
|
-
r.write_jobs(gdrive_email)
|
75
|
-
r.update_attributes(:last_run=>Time.now.utc)
|
76
|
-
end
|
77
|
-
|
78
|
-
def jobs_sheet(gdrive_email)#gdrive_email to read with
|
79
|
-
r = self
|
80
|
-
r.find_or_create_gbook_by_title(r.jobspec_title,gdrive_email)
|
81
|
-
jobs_name = [r.jobspec_title,"Jobs"].join("/")
|
82
|
-
r.find_or_create_gsheet_by_name(jobs_name,gdrive_email)
|
83
|
-
end
|
84
|
-
|
85
|
-
def read_jobs(gdrive_email)
|
86
|
-
r = self
|
87
|
-
jobs_sheet = r.jobs_sheet(gdrive_email)
|
88
|
-
rem_jobs = jobs_sheet.to_tsv.tsv_to_hash_array
|
89
|
-
#go through each job, update relevant job with its params
|
90
|
-
loc_jobs = []
|
91
|
-
rem_jobs.each_with_index do |rj,rj_i|
|
92
|
-
#skip bad rows
|
93
|
-
next if (rj['name'].to_s.first == "#" or ['name','schedule','tasks','active'].select{|c| rj[c].to_s.strip==""}.length>0)
|
94
|
-
j = Job.find_or_create_by_requestor_id_and_name(r.id.to_s,rj['name'])
|
95
|
-
#update top line params
|
96
|
-
j.update_attributes(:active => rj['active'],
|
97
|
-
:schedule => rj['schedule'],
|
98
|
-
:tasks => rj['tasks'],
|
99
|
-
:datasets => rj['datasets'],
|
100
|
-
:params => rj['params'],
|
101
|
-
:destination => rj['destination'])
|
102
|
-
#update laststatus with "Created job for" if job is due
|
103
|
-
j.update_status("Due and active at #{Time.now.utc}") if j.is_due? and j.active
|
104
|
-
#add this job to list of local ones
|
105
|
-
loc_jobs << j
|
106
|
-
end
|
107
|
-
#deactivate requestor jobs that are not included in sheet;
|
108
|
-
#this makes sure we don't run obsolete jobs
|
109
|
-
(r.jobs.map{|j| j.id.to_s} - loc_jobs.map{|j| j.id.to_s}).each do |rjid|
|
110
|
-
j = Job.find(rjid)
|
111
|
-
if j.active
|
112
|
-
j.update_attributes(:active=>false)
|
113
|
-
r.update_status("Deactivated job:#{r.name}=>#{j.name}")
|
114
|
-
end
|
115
|
-
end
|
116
|
-
r.update_status(r.name + " jobs read at #{Time.now.utc}")
|
117
|
-
return true
|
118
|
-
end
|
119
|
-
|
120
|
-
def write_jobs(gdrive_email) #gdrive_email to update with
|
121
|
-
r = self
|
122
|
-
jobs_sheet = r.jobs_sheet(gdrive_email)
|
123
|
-
rem_jobs = jobs_sheet.to_tsv.tsv_to_hash_array
|
124
|
-
#go through each job, update relevant job with its params
|
125
|
-
headers = Requestor.jobs_sheet_headers
|
126
|
-
#write headers
|
127
|
-
jobs_sheet.add_headers(headers)
|
128
|
-
#write rows
|
129
|
-
rem_jobs.each_with_index do |rj,rj_i|
|
130
|
-
#skip bad rows
|
131
|
-
next if (rj['name'].to_s.first == "#" or ['name','schedule','tasks','active'].select{|c| rj[c].to_s.strip==""}.length>0)
|
132
|
-
if j = r.jobs(rj['name'])
|
133
|
-
#update active to false if this was a run once
|
134
|
-
j.update_attributes(:active=>false) if j.schedule.to_s == 'once'
|
135
|
-
jobs_sheet[rj_i+2,headers.index('active')+1] = j.active.to_s
|
136
|
-
jobs_sheet[rj_i+2,headers.index('status')+1] = j.status.to_s.gsub("\n",";").gsub("\t"," ")
|
137
|
-
jobs_sheet[rj_i+2,headers.index('last_error')+1] = j.last_error.to_s.gsub("\n",";").gsub("\t"," ")
|
138
|
-
jobs_sheet[rj_i+2,headers.index('destination_url')+1] = j.destination_url.to_s
|
139
|
-
end
|
140
|
-
end
|
141
|
-
jobs_sheet.save
|
142
|
-
r.update_status(r.name + " jobs written")
|
143
|
-
return true
|
144
|
-
end
|
145
|
-
|
146
|
-
def jobspec_title
|
147
|
-
r = self
|
148
|
-
prefix = "Jobspec_"
|
149
|
-
suffix = ""
|
150
|
-
if Mobilize::Base.env == 'development'
|
151
|
-
suffix = "_dev"
|
152
|
-
elsif Mobilize::Base.env == 'test' or Mobilize::Base.env == 'pry_dev'
|
153
|
-
suffix = "_test"
|
154
|
-
elsif Mobilize::Base.env == 'production' or Mobilize::Base.env == 'integration'
|
155
|
-
suffix = ""
|
156
|
-
else
|
157
|
-
raise "Invalid environment"
|
158
|
-
end
|
159
|
-
title = prefix + r.name + suffix
|
160
|
-
return title
|
161
|
-
end
|
162
|
-
|
163
|
-
#Google doc helper methods
|
164
|
-
|
165
|
-
def find_or_create_gbook_by_title(title,gdrive_email)
|
166
|
-
r = self
|
167
|
-
book_dst = Dataset.find_or_create_by_handler_and_name('gbook',title)
|
168
|
-
#give dst this requestor if none
|
169
|
-
book_dst.update_attributes(:requestor_id=>r.id.to_s) if book_dst.requestor_id.nil?
|
170
|
-
book = Gbook.find_or_create_by_dst_id(book_dst.id.to_s,gdrive_email)
|
171
|
-
return book
|
172
|
-
end
|
173
|
-
|
174
|
-
def find_or_create_gsheet_by_name(name,gdrive_email)
|
175
|
-
r = self
|
176
|
-
sheet_dst = Dataset.find_or_create_by_handler_and_name('gsheet',name)
|
177
|
-
sheet_dst.update_attributes(:requestor_id=>r.id.to_s) if sheet_dst.requestor_id.nil?
|
178
|
-
sheet = Gsheet.find_or_create_by_dst_id(sheet_dst.id.to_s,gdrive_email)
|
179
|
-
return sheet
|
180
|
-
end
|
181
|
-
|
182
|
-
def jobs(jname=nil)
|
183
|
-
r = self
|
184
|
-
js = Job.find_all_by_requestor_id(r.id.to_s)
|
185
|
-
if jname
|
186
|
-
return js.sel{|j| j.name == jname}.first
|
187
|
-
else
|
188
|
-
return js
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def destroy_jobs
|
193
|
-
r = self
|
194
|
-
r.jobs.each{|s| s.delete}
|
195
|
-
end
|
196
|
-
|
197
|
-
def gsheets
|
198
|
-
r = self
|
199
|
-
Dataset.find_all_by_handler_and_requestor_id('gsheet',r.id.to_s)
|
200
|
-
end
|
201
|
-
|
202
|
-
def worker
|
203
|
-
r = self
|
204
|
-
Mobilize::Resque.find_worker_by_mongo_id(r.id.to_s)
|
205
|
-
end
|
206
|
-
|
207
|
-
def update_status(msg)
|
208
|
-
r = self
|
209
|
-
r.update_attributes(:status=>msg)
|
210
|
-
Mobilize::Resque.update_job_status(r.id.to_s,msg)
|
211
|
-
return true
|
212
|
-
end
|
213
|
-
|
214
|
-
def is_working?
|
215
|
-
r = self
|
216
|
-
Mobilize::Resque.active_mongo_ids.include?(r.id.to_s)
|
217
|
-
end
|
218
|
-
|
219
|
-
def is_due?
|
220
|
-
r = self.reload
|
221
|
-
return false if r.is_working?
|
222
|
-
last_due_time = Time.now.utc - Jobtracker.requestor_refresh_freq
|
223
|
-
return true if r.last_run.nil? or r.last_run < last_due_time
|
224
|
-
end
|
225
|
-
|
226
|
-
def enqueue!
|
227
|
-
r = self
|
228
|
-
::Resque::Job.create("mobilize",Requestor,r.id.to_s,{"name"=>r.name})
|
229
|
-
return true
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
data/lib/mobilize-base/tasks.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# require 'resque/tasks'
|
2
|
-
# will give you the resque tasks
|
3
|
-
|
4
|
-
namespace :mobilize do
|
5
|
-
|
6
|
-
desc "Start a Resque worker"
|
7
|
-
task :work do
|
8
|
-
require 'resque'
|
9
|
-
require 'mobilize-base'
|
10
|
-
|
11
|
-
begin
|
12
|
-
worker = Resque::Worker.new(Mobilize::Resque.config['queue_name'])
|
13
|
-
rescue Resque::NoQueueError
|
14
|
-
abort "set QUEUE env var, e.g. $ QUEUE=critical,high rake resque:work"
|
15
|
-
end
|
16
|
-
|
17
|
-
puts "Starting worker #{worker}"
|
18
|
-
|
19
|
-
worker.work(ENV['INTERVAL'] || 5) # interval, will block
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "Set up config and log folders and files"
|
23
|
-
task :setup do
|
24
|
-
sample_dir = File.dirname(__FILE__) + '/../samples/'
|
25
|
-
sample_files = Dir.entries(sample_dir)
|
26
|
-
config_dir = "#{ENV['PWD']}/config/"
|
27
|
-
log_dir = "#{ENV['PWD']}/log/"
|
28
|
-
unless File.exists?(config_dir)
|
29
|
-
puts "creating config dir"
|
30
|
-
`mkdir #{config_dir}`
|
31
|
-
end
|
32
|
-
unless File.exists?(log_dir)
|
33
|
-
puts "creating log dir"
|
34
|
-
`mkdir #{log_dir}`
|
35
|
-
end
|
36
|
-
sample_files.each do |fname|
|
37
|
-
unless File.exists?("#{config_dir}#{fname}")
|
38
|
-
puts "creating config/#{fname}"
|
39
|
-
`cp #{sample_dir}#{fname} #{config_dir}#{fname}`
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|