]> git.openstreetmap.org Git - chef.git/blob - cookbooks/planet/recipes/replication.rb
Introduce a node attribute for the ruby interpreter path
[chef.git] / cookbooks / planet / recipes / replication.rb
1 #
2 # Cookbook:: planet
3 # Recipe:: dump
4 #
5 # Copyright:: 2013, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     https://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 require "yaml"
21
22 include_recipe "accounts"
23 include_recipe "apt"
24 include_recipe "osmosis"
25 include_recipe "planet::aws"
26 include_recipe "ruby"
27 include_recipe "tools"
28
29 db_passwords = data_bag_item("db", "passwords")
30
31 ## Install required packages
32
33 package %w[
34   postgresql-client
35   make
36   gcc
37   libc6-dev
38   libpq-dev
39   libxml2-dev
40   osmdbt
41 ]
42
43 gem_package "libxml-ruby" do
44   gem_binary node[:ruby][:gem]
45 end
46
47 gem_package "pg" do
48   gem_binary node[:ruby][:gem]
49 end
50
51 ## Build preload library to flush files
52
53 remote_directory "/opt/flush" do
54   source "flush"
55   owner "root"
56   group "root"
57   mode "755"
58   files_owner "root"
59   files_group "root"
60   files_mode "755"
61 end
62
63 execute "/opt/flush/Makefile" do
64   action :nothing
65   command "make"
66   cwd "/opt/flush"
67   user "root"
68   group "root"
69   subscribes :run, "remote_directory[/opt/flush]"
70 end
71
72 ## Install scripts
73
74 remote_directory "/usr/local/bin" do
75   source "replication-bin"
76   owner "root"
77   group "root"
78   mode "755"
79   files_owner "root"
80   files_group "root"
81   files_mode "755"
82 end
83
84 template "/usr/local/bin/users-agreed" do
85   source "users-agreed.erb"
86   owner "root"
87   group "root"
88   mode "755"
89 end
90
91 template "/usr/local/bin/users-deleted" do
92   source "users-deleted.erb"
93   owner "root"
94   group "root"
95   mode "755"
96 end
97
98 template "/usr/local/bin/replicate-changesets" do
99   source "replicate-changesets.erb"
100   owner "root"
101   group "root"
102   mode "755"
103 end
104
105 ## Published deleted users directory
106
107 remote_directory "/store/planet/users_deleted" do
108   source "users_deleted"
109   owner "planet"
110   group "planet"
111   mode "755"
112   files_owner "root"
113   files_group "root"
114   files_mode "644"
115 end
116
117 ## Published replication directory
118
119 remote_directory "/store/planet/replication" do
120   source "replication-cgi"
121   owner "root"
122   group "root"
123   mode "755"
124   files_owner "root"
125   files_group "root"
126   files_mode "755"
127 end
128
129 ## Configuration directory
130
131 directory "/etc/replication" do
132   owner "root"
133   group "root"
134   mode "755"
135 end
136
137 ## Transient state directory
138
139 systemd_tmpfile "/run/replication" do
140   type "d"
141   owner "planet"
142   group "planet"
143   mode "755"
144 end
145
146 ## Persistent state directory
147
148 directory "/var/lib/replication" do
149   owner "planet"
150   group "planet"
151   mode "755"
152 end
153
154 ## Temporary directory
155
156 directory "/store/replication" do
157   owner "planet"
158   group "planet"
159   mode "755"
160 end
161
162 ## Users replication
163
164 template "/etc/replication/users-agreed.conf" do
165   source "users-agreed.conf.erb"
166   user "planet"
167   group "planet"
168   mode "600"
169   variables :password => db_passwords["planetdiff"]
170 end
171
172 systemd_service "users-agreed" do
173   description "Update list of users accepting CTs"
174   user "planet"
175   exec_start "/usr/local/bin/users-agreed"
176   nice 10
177   sandbox :enable_network => true
178   read_write_paths "/store/planet/users_agreed"
179 end
180
181 systemd_timer "users-agreed" do
182   description "Update list of users accepting CTs"
183   on_calendar "7:00"
184 end
185
186 systemd_service "users-deleted" do
187   description "Update list of deleted users"
188   user "planet"
189   exec_start "/usr/local/bin/users-deleted"
190   nice 10
191   sandbox :enable_network => true
192   read_write_paths "/store/planet/users_deleted"
193 end
194
195 systemd_timer "users-deleted" do
196   description "Update list of deleted users"
197   on_calendar "17:00"
198 end
199
200 ## Changeset replication
201
202 directory "/store/planet/replication/changesets" do
203   owner "planet"
204   group "planet"
205   mode "755"
206 end
207
208 template "/etc/replication/changesets.conf" do
209   source "changesets.conf.erb"
210   user "root"
211   group "planet"
212   mode "640"
213   variables :password => db_passwords["planetdiff"]
214 end
215
216 systemd_service "replication-changesets" do
217   description "Changesets replication"
218   user "planet"
219   exec_start "/usr/local/bin/replicate-changesets /etc/replication/changesets.conf"
220   sandbox :enable_network => true
221   protect_home "tmpfs"
222   bind_paths "/home/planet"
223   read_write_paths [
224     "/run/replication",
225     "/store/planet/replication/changesets"
226   ]
227 end
228
229 systemd_timer "replication-changesets" do
230   description "Changesets replication"
231   on_boot_sec 60
232   on_unit_active_sec 60
233   accuracy_sec 5
234 end
235
236 ## Minutely replication
237
238 directory "/store/planet/replication/minute" do
239   owner "planet"
240   group "planet"
241   mode "755"
242 end
243
244 directory "/var/lib/replication/minute" do
245   owner "planet"
246   group "planet"
247   mode "755"
248 end
249
250 directory "/store/replication/minute" do
251   owner "planet"
252   group "planet"
253   mode "755"
254 end
255
256 osmdbt_config = {
257   "database" => {
258     "host" => node[:web][:database_host],
259     "dbname" => "openstreetmap",
260     "user" => "planetdiff",
261     "password" => db_passwords["planetdiff"],
262     "replication_slot" => "osmdbt"
263   },
264   "log_dir" => "/var/lib/replication/minute",
265   "changes_dir" => "/store/planet/replication/minute",
266   "tmp_dir" => "/store/replication/minute",
267   "run_dir" => "/run/replication"
268 }
269
270 file "/etc/replication/osmdbt-config.yaml" do
271   user "root"
272   group "planet"
273   mode "640"
274   content YAML.dump(osmdbt_config)
275 end
276
277 systemd_service "replication-minutely" do
278   description "Minutely replication"
279   user "planet"
280   working_directory "/etc/replication"
281   exec_start "/usr/local/bin/replicate-minute"
282   sandbox :enable_network => true
283   protect_home "tmpfs"
284   bind_paths "/home/planet"
285   read_write_paths [
286     "/run/replication",
287     "/store",
288     "/var/lib/replication/minute"
289   ]
290 end
291
292 systemd_timer "replication-minutely" do
293   description "Minutely replication"
294   on_boot_sec 60
295   on_unit_active_sec 60
296   accuracy_sec 5
297 end
298
299 ## Hourly replication
300
301 directory "/store/planet/replication/hour" do
302   owner "planet"
303   group "planet"
304   mode "755"
305 end
306
307 directory "/var/lib/replication/hour" do
308   owner "planet"
309   group "planet"
310   mode "755"
311 end
312
313 link "/var/lib/replication/hour/data" do
314   to "/store/planet/replication/hour"
315 end
316
317 template "/var/lib/replication/hour/configuration.txt" do
318   source "replication.config.erb"
319   owner "planet"
320   group "planet"
321   mode "644"
322   variables :base => "minute", :interval => 3600
323 end
324
325 systemd_service "replication-hourly" do
326   description "Hourly replication"
327   user "planet"
328   exec_start "/usr/local/bin/replicate-hour"
329   environment "LD_PRELOAD" => "/opt/flush/flush.so"
330   sandbox :enable_network => true
331   memory_deny_write_execute false
332   protect_home "tmpfs"
333   bind_paths "/home/planet"
334   read_write_paths [
335     "/store/planet/replication/hour",
336     "/var/lib/replication/hour"
337   ]
338 end
339
340 systemd_timer "replication-hourly" do
341   description "Hourly replication"
342   on_calendar "*-*-* *:02/15:00"
343 end
344
345 ## Daily replication
346
347 directory "/store/planet/replication/day" do
348   owner "planet"
349   group "planet"
350   mode "755"
351 end
352
353 directory "/var/lib/replication/day" do
354   owner "planet"
355   group "planet"
356   mode "755"
357 end
358
359 link "/var/lib/replication/day/data" do
360   to "/store/planet/replication/day"
361 end
362
363 template "/var/lib/replication/day/configuration.txt" do
364   source "replication.config.erb"
365   owner "planet"
366   group "planet"
367   mode "644"
368   variables :base => "hour", :interval => 86400
369 end
370
371 systemd_service "replication-daily" do
372   description "Daily replication"
373   user "planet"
374   exec_start "/usr/local/bin/replicate-day"
375   environment "LD_PRELOAD" => "/opt/flush/flush.so"
376   sandbox :enable_network => true
377   memory_deny_write_execute false
378   protect_home "tmpfs"
379   bind_paths "/home/planet"
380   read_write_paths [
381     "/store/planet/replication/day",
382     "/var/lib/replication/day"
383   ]
384 end
385
386 systemd_timer "replication-daily" do
387   description "Daily replication"
388   on_calendar "*-*-* *:02/15:00"
389 end
390
391 ## Replication cleanup
392
393 systemd_service "replication-cleanup" do
394   description "Cleanup replication"
395   user "planet"
396   exec_start "/usr/local/bin/replicate-cleanup"
397   sandbox true
398   read_write_paths "/var/lib/replication"
399 end
400
401 systemd_timer "replication-cleanup" do
402   description "Cleanup replication"
403   on_boot_sec 60
404   on_unit_active_sec 86400
405   accuracy_sec 1800
406 end
407
408 ## Enable/disable feeds
409
410 if node[:planet][:replication] == "enabled"
411   service "users-agreed.timer" do
412     action [:enable, :start]
413   end
414
415   service "users-deleted.timer" do
416     action [:enable, :start]
417   end
418
419   service "replication-changesets.timer" do
420     action [:enable, :start]
421   end
422
423   service "replication-minutely.timer" do
424     action [:enable, :start]
425   end
426
427   service "replication-hourly.timer" do
428     action [:enable, :start]
429   end
430
431   service "replication-daily.timer" do
432     action [:enable, :start]
433   end
434
435   service "replication-cleanup.timer" do
436     action [:enable, :start]
437   end
438 else
439   service "users-agreed.timer" do
440     action [:stop, :disable]
441   end
442
443   service "users-deleted.timer" do
444     action [:stop, :disable]
445   end
446
447   service "replication-changesets.timer" do
448     action [:stop, :disable]
449   end
450
451   service "replication-minutely.timer" do
452     action [:stop, :disable]
453   end
454
455   service "replication-hourly.timer" do
456     action [:stop, :disable]
457   end
458
459   service "replication-daily.timer" do
460     action [:stop, :disable]
461   end
462
463   service "replication-cleanup.timer" do
464     action [:stop, :disable]
465   end
466 end