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