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