]> git.openstreetmap.org Git - chef.git/blob - cookbooks/planet/recipes/replication.rb
Switch minutely replication to use osmdbt
[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/replicate-minute" do
78   source "replicate-minute.erb"
79   owner "root"
80   group "root"
81   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 ## Published deleted users directory
99
100 remote_directory "/store/planet/users_deleted" do
101   source "users_deleted"
102   owner "planet"
103   group "planet"
104   mode "755"
105   files_owner "root"
106   files_group "root"
107   files_mode "644"
108 end
109
110 ## Published replication directory
111
112 remote_directory "/store/planet/replication" do
113   source "replication-cgi"
114   owner "root"
115   group "root"
116   mode "755"
117   files_owner "root"
118   files_group "root"
119   files_mode "755"
120 end
121
122 ## Configuration directory
123
124 directory "/etc/replication" do
125   owner "root"
126   group "root"
127   mode "755"
128 end
129
130 ## Transient state directory
131
132 systemd_tmpfile "/run/replication" do
133   type "d"
134   owner "planet"
135   group "planet"
136   mode "755"
137 end
138
139 ## Persistent state directory
140
141 directory "/var/lib/replication" do
142   owner "planet"
143   group "planet"
144   mode "755"
145 end
146
147 ## Temporary directory
148
149 directory "/store/replication" do
150   owner "planet"
151   group "planet"
152   mode "755"
153 end
154
155 ## Users replication
156
157 template "/etc/replication/users-agreed.conf" do
158   source "users-agreed.conf.erb"
159   user "planet"
160   group "planet"
161   mode "600"
162   variables :password => db_passwords["planetdiff"]
163 end
164
165 ## Changeset replication
166
167 directory "/store/planet/replication/changesets" do
168   owner "planet"
169   group "planet"
170   mode "755"
171 end
172
173 template "/etc/replication/changesets.conf" do
174   source "changesets.conf.erb"
175   user "root"
176   group "planet"
177   mode "640"
178   variables :password => db_passwords["planetdiff"]
179 end
180
181 ## Minutely replication
182
183 directory "/store/planet/replication/minute" do
184   owner "planet"
185   group "planet"
186   mode "755"
187 end
188
189 directory "/var/lib/replication/minute" do
190   owner "planet"
191   group "planet"
192   mode "755"
193 end
194
195 directory "/store/replication/minute" do
196   owner "planet"
197   group "planet"
198   mode "755"
199 end
200
201 osmdbt_config = {
202   "database" => {
203     "host" => node[:web][:database_host],
204     "dbname" => "openstreetmap",
205     "user" => "planetdiff",
206     "password" => db_passwords["planetdiff"],
207     "replication_slot" => "osmdbt"
208   },
209   "log_dir" => "/var/lib/replication/minute",
210   "changes_dir" => "/store/planet/replication/minute",
211   "tmp_dir" => "/store/replication/minute",
212   "run_dir" => "/run/replication"
213 }
214
215 file "/etc/replication/osmdbt-config.yaml" do
216   user "root"
217   group "planet"
218   mode "640"
219   content YAML.dump(osmdbt_config)
220 end
221
222 systemd_service "replication-minutely" do
223   description "Minutely replication"
224   user "planet"
225   working_directory "/etc/replication"
226   exec_start "/usr/local/bin/replicate-minute"
227   private_tmp true
228   private_devices true
229   protect_system "full"
230   protect_home true
231   restrict_address_families %w[AF_INET AF_INET6]
232   no_new_privileges true
233 end
234
235 systemd_timer "replication-minutely" do
236   description "Minutely replication"
237   on_boot_sec 60
238   on_unit_active_sec 60
239   accuracy_sec 5
240 end
241
242 file "/etc/replication/auth.conf" do
243   action :delete
244 end
245
246 ## Hourly replication
247
248 directory "/store/planet/replication/hour" do
249   owner "planet"
250   group "planet"
251   mode "755"
252 end
253
254 directory "/var/lib/replication/hour" do
255   owner "planet"
256   group "planet"
257   mode "755"
258 end
259
260 link "/var/lib/replication/hour/data" do
261   to "/store/planet/replication/hour"
262 end
263
264 template "/var/lib/replication/hour/configuration.txt" do
265   source "replication.config.erb"
266   owner "planet"
267   group "planet"
268   mode "644"
269   variables :base => "minute", :interval => 3600
270 end
271
272 systemd_service "replication-hourly" do
273   description "Hourly replication"
274   user "planet"
275   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/hour"
276   private_tmp true
277   private_devices true
278   protect_system "full"
279   protect_home true
280   restrict_address_families %w[AF_INET AF_INET6]
281   no_new_privileges true
282 end
283
284 systemd_timer "replication-hourly" do
285   description "Daily replication"
286   on_calendar "*-*-* *:02/15:00"
287 end
288
289 ## Daily replication
290
291 directory "/store/planet/replication/day" do
292   owner "planet"
293   group "planet"
294   mode "755"
295 end
296
297 directory "/var/lib/replication/day" do
298   owner "planet"
299   group "planet"
300   mode "755"
301 end
302
303 link "/var/lib/replication/day/data" do
304   to "/store/planet/replication/day"
305 end
306
307 template "/var/lib/replication/day/configuration.txt" do
308   source "replication.config.erb"
309   owner "planet"
310   group "planet"
311   mode "644"
312   variables :base => "hour", :interval => 86400
313 end
314
315 systemd_service "replication-daily" do
316   description "Daily replication"
317   user "planet"
318   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/day"
319   private_tmp true
320   private_devices true
321   protect_system "full"
322   protect_home true
323   restrict_address_families %w[AF_INET AF_INET6]
324   no_new_privileges true
325 end
326
327 systemd_timer "replication-daily" do
328   description "Daily replication"
329   on_calendar "*-*-* *:02/15:00"
330 end
331
332 ## Enable/disable feeds
333
334 if node[:planet][:replication] == "enabled"
335   cron_d "users-agreed" do
336     minute "0"
337     hour "7"
338     user "planet"
339     command "/usr/local/bin/users-agreed"
340     mailto "zerebubuth@gmail.com"
341   end
342
343   cron_d "users-deleted" do
344     minute "0"
345     hour "17"
346     user "planet"
347     command "/usr/local/bin/users-deleted"
348     mailto "zerebubuth@gmail.com"
349   end
350
351   cron_d "replication-changesets" do
352     user "planet"
353     command "/usr/local/bin/replicate-changesets /etc/replication/changesets.conf"
354     mailto "zerebubuth@gmail.com"
355   end
356
357   service "replication-minutely.timer" do
358     action [:enable, :start]
359   end
360
361   service "replication-hourly.timer" do
362     action [:enable, :start]
363   end
364
365   service "replication-daily.timer" do
366     action [:enable, :start]
367   end
368 else
369   cron_d "users-agreed" do
370     action :delete
371   end
372
373   cron_d "users-deleted" do
374     action :delete
375   end
376
377   cron_d "replication-changesets" do
378     action :delete
379   end
380
381   service "replication-minutely.timer" do
382     action [:stop, :disable]
383   end
384
385   service "replication-hourly.timer" do
386     action [:stop, :disable]
387   end
388
389   service "replication-daily.timer" do
390     action [:stop, :disable]
391   end
392 end