postgresinator 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/postgresinator/pg.rb +39 -36
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67dc7fc295b063ab6ed315426cf30f5b2d5d9735
|
4
|
+
data.tar.gz: 9d23816e865134f11596cc1a4f84ac46b61bacbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f813adf14fdce2ff7216d7dbdc21145f5120c9a643ab329a7af992d1f275e1a72b561a939d2b33bbe12f5c1f71ccbe3a52e9f0d7b1103852b044bc81fbc1d89
|
7
|
+
data.tar.gz: 8a740ce1afe9a1abec656ad566f8b9eda2c5d2f524178b25743d266f2db9e0e31757b66101baa8d74e867ea41bceccee5749c6cd556c5040def3d84c8827ea3d
|
data/lib/postgresinator/pg.rb
CHANGED
@@ -23,7 +23,7 @@ namespace :pg do
|
|
23
23
|
desc "Idempotently setup one or more PostgreSQL instances using values in ./postgresinator.rb"
|
24
24
|
task :setup => :ensure_setup do
|
25
25
|
# instance variables are lost inside SSHKit's 'on' block, so
|
26
|
-
# at the beginning of each task we assign
|
26
|
+
# at the beginning of each task we assign cluster to @cluster.
|
27
27
|
cluster = @cluster
|
28
28
|
cluster.servers.each do |server|
|
29
29
|
Rake::Task['pg:ensure_access_docker'].invoke(server.domain)
|
@@ -35,21 +35,21 @@ namespace :pg do
|
|
35
35
|
config_file_changed = false
|
36
36
|
cluster.image.config_files.each do |config_file|
|
37
37
|
next if config_file == "recovery.conf"
|
38
|
-
if
|
38
|
+
if pg_config_file_differs?(cluster, server, config_file)
|
39
39
|
warn "Config file #{config_file} on #{server.domain} is being updated."
|
40
40
|
Rake::Task['pg:install_config_file'].invoke(server.domain, config_file)
|
41
41
|
Rake::Task['pg:install_config_file'].reenable
|
42
42
|
config_file_changed = true
|
43
43
|
end
|
44
44
|
end
|
45
|
-
unless
|
45
|
+
unless pg_container_exists?(server)
|
46
46
|
# the create_container task's prerequisite task :ensure_config_files is
|
47
47
|
# for manual use of create_container, so here we clear_prerequisites.
|
48
48
|
Rake::Task['pg:create_container'].clear_prerequisites
|
49
49
|
Rake::Task['pg:create_container'].invoke(server.domain)
|
50
50
|
Rake::Task['pg:create_container'].reenable
|
51
51
|
else
|
52
|
-
unless
|
52
|
+
unless pg_container_is_running?(server)
|
53
53
|
Rake::Task['pg:start_container'].invoke(server.domain)
|
54
54
|
Rake::Task['pg:start_container'].reenable
|
55
55
|
else
|
@@ -64,18 +64,18 @@ namespace :pg do
|
|
64
64
|
# sleep to allow postgres to start up before running subsequent commands against it
|
65
65
|
sleep 3
|
66
66
|
if server.master
|
67
|
-
unless
|
67
|
+
unless pg_role_exists?(cluster, server, "replicator")
|
68
68
|
info "Creating role 'replicator' #{server.domain}"
|
69
69
|
Rake::Task['pg:create_role'].invoke(server.domain, "replicator")
|
70
70
|
Rake::Task['pg:create_role'].reenable
|
71
71
|
end
|
72
72
|
cluster.databases.each do |database|
|
73
|
-
unless
|
73
|
+
unless pg_role_exists?(cluster, server, database.role)
|
74
74
|
info "Creating role #{database.role} on #{server.domain}"
|
75
75
|
Rake::Task['pg:create_role'].invoke(server.domain, database.role)
|
76
76
|
Rake::Task['pg:create_role'].reenable
|
77
77
|
end
|
78
|
-
unless
|
78
|
+
unless pg_database_exists?(cluster, server, database)
|
79
79
|
info "Creating database #{database.name} on #{server.domain}"
|
80
80
|
Rake::Task['pg:create_database'].invoke(server.domain, database.name)
|
81
81
|
Rake::Task['pg:create_database'].reenable
|
@@ -102,9 +102,9 @@ namespace :pg do
|
|
102
102
|
cluster = @cluster
|
103
103
|
server = cluster.servers.select { |s| s.domain == args.domain }.first
|
104
104
|
on "#{cluster.ssh_user}@#{server.domain}" do
|
105
|
-
if
|
105
|
+
if pg_container_exists?(server)
|
106
106
|
info "#{server.container_name} exists on #{server.domain}"
|
107
|
-
if
|
107
|
+
if pg_container_is_running?(server)
|
108
108
|
info ""
|
109
109
|
info "#{server.container_name} is running on #{server.domain}"
|
110
110
|
info ""
|
@@ -134,8 +134,8 @@ namespace :pg do
|
|
134
134
|
on "#{cluster.ssh_user}@#{server.domain}" do
|
135
135
|
if server.master
|
136
136
|
clean = ""
|
137
|
-
unless
|
138
|
-
if
|
137
|
+
unless pg_database_empty?(cluster, server, database)
|
138
|
+
if pg_confirm_database_overwrite?(server, database); clean = "--clean"; else exit(0); end
|
139
139
|
end
|
140
140
|
execute("docker", "run", "--rm",
|
141
141
|
"--volume", "/tmp:/tmp:rw",
|
@@ -157,7 +157,7 @@ namespace :pg do
|
|
157
157
|
server = cluster.servers.select { |s| s.master }.first
|
158
158
|
on "#{cluster.ssh_user}@#{server.domain}" do
|
159
159
|
if server.master
|
160
|
-
|
160
|
+
pg_confirm_file_overwrite?(server, args.dump_file) if pg_file_exists?("/tmp/#{args.dump_file}")
|
161
161
|
execute("docker", "run", "--rm",
|
162
162
|
"--volume", "/tmp:/tmp:rw",
|
163
163
|
"--entrypoint", "/bin/bash",
|
@@ -186,7 +186,7 @@ namespace :pg do
|
|
186
186
|
on "#{cluster.ssh_user}@#{server.domain}" do
|
187
187
|
cluster.image.config_files.each do |config_file|
|
188
188
|
next if config_file == "recovery.conf"
|
189
|
-
if
|
189
|
+
if pg_config_file_differs?(cluster, server, config_file)
|
190
190
|
Rake::Task['pg:install_config_file'].invoke(server.domain, config_file)
|
191
191
|
Rake::Task['pg:install_config_file'].reenable
|
192
192
|
end
|
@@ -200,7 +200,7 @@ namespace :pg do
|
|
200
200
|
master_server = cluster.servers.select { |s| s.master }.first
|
201
201
|
unless server.master
|
202
202
|
on "#{cluster.ssh_user}@#{master_server.domain}" do
|
203
|
-
fatal "Master must be running before creating a slave" and raise unless
|
203
|
+
fatal "Master must be running before creating a slave" and raise unless pg_container_is_running?(master_server)
|
204
204
|
end
|
205
205
|
end
|
206
206
|
on "#{cluster.ssh_user}@#{server.domain}" do
|
@@ -208,7 +208,7 @@ namespace :pg do
|
|
208
208
|
as 'root' do
|
209
209
|
fatal_message = "#{server.data_path} on #{server.domain} is not empty, cannot continue! " +
|
210
210
|
"You'll need to delete those files by hand. Be sure you are not deleting important data!"
|
211
|
-
fatal fatal_message and raise if
|
211
|
+
fatal fatal_message and raise if pg_files_in_data_path?(server)
|
212
212
|
execute("mkdir", "-p", server.data_path) unless test("test", "-d", server.data_path)
|
213
213
|
execute("chown", "-R", "#{cluster.image.postgres_uid}:#{cluster.image.postgres_gid}", server.data_path)
|
214
214
|
execute("chmod", "700", server.data_path)
|
@@ -233,7 +233,7 @@ namespace :pg do
|
|
233
233
|
warn "Restarting a running container named #{server.container_name}"
|
234
234
|
execute("docker", "restart", server.container_name)
|
235
235
|
sleep 2
|
236
|
-
fatal
|
236
|
+
fatal pg_stay_running_message(server) and raise unless pg_container_is_running?(server)
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
@@ -244,7 +244,7 @@ namespace :pg do
|
|
244
244
|
warn "Starting an existing but non-running container named #{server.container_name}"
|
245
245
|
execute("docker", "start", server.container_name)
|
246
246
|
sleep 2
|
247
|
-
fatal
|
247
|
+
fatal pg_stay_running_message(server) and raise unless pg_container_is_running?(server)
|
248
248
|
end
|
249
249
|
end
|
250
250
|
|
@@ -268,7 +268,7 @@ namespace :pg do
|
|
268
268
|
# TODO: get this recovery.conf dependancy out of here?
|
269
269
|
path = args.config_file == "recovery.conf" ? server.data_path : server.conf_path
|
270
270
|
execute("mkdir", "-p", path) unless test("test", "-d", path)
|
271
|
-
generated_config_file =
|
271
|
+
generated_config_file = pg_generate_config_file(cluster, server, args.config_file)
|
272
272
|
upload! StringIO.new(generated_config_file), "/tmp/#{args.config_file}"
|
273
273
|
execute("mv", "/tmp/#{args.config_file}", "#{path}/#{args.config_file}")
|
274
274
|
execute("chown", "-R", "#{cluster.image.postgres_uid}:#{cluster.image.postgres_gid}", path)
|
@@ -383,7 +383,7 @@ namespace :pg do
|
|
383
383
|
as "root" do
|
384
384
|
inner_server_crt = "#{cluster.image.data_path}/server.crt"
|
385
385
|
outer_server_crt = "#{server.data_path}/server.crt"
|
386
|
-
unless
|
386
|
+
unless pg_file_exists?(outer_server_crt)
|
387
387
|
execute("docker", "run",
|
388
388
|
"--rm", "--user", "root", "--entrypoint", "/bin/ln",
|
389
389
|
"--volume", "#{server.data_path}:#{cluster.image.data_path}:rw",
|
@@ -393,7 +393,7 @@ namespace :pg do
|
|
393
393
|
end
|
394
394
|
inner_server_key = "#{cluster.image.data_path}/server.key"
|
395
395
|
outer_server_key = "#{server.data_path}/server.key"
|
396
|
-
unless
|
396
|
+
unless pg_file_exists?(outer_server_key)
|
397
397
|
execute("docker", "run",
|
398
398
|
"--rm", "--user", "root", "--entrypoint", "/bin/ln",
|
399
399
|
"--volume", "#{server.data_path}:#{cluster.image.data_path}:rw",
|
@@ -419,18 +419,21 @@ namespace :pg do
|
|
419
419
|
|
420
420
|
private
|
421
421
|
|
422
|
-
|
422
|
+
# Temporarily added 'pg_' to the beginning of each of these methods to avoid
|
423
|
+
# getting them overwritten by other gems with methods with the same names, (E.G. nginxinator.)
|
424
|
+
## TODO Figure out how to do this the right or better way.
|
425
|
+
def pg_stay_running_message(server)
|
423
426
|
"Container #{server.container_name} on #{server.domain} did not stay running more than 2 seconds"
|
424
427
|
end
|
425
428
|
|
426
|
-
def
|
429
|
+
def pg_files_in_data_path?(server)
|
427
430
|
test("[", "\"$(ls", "-A", "#{server.data_path})\"", "]")
|
428
431
|
end
|
429
432
|
|
430
|
-
def
|
431
|
-
generated_config_file =
|
433
|
+
def pg_config_file_differs?(cluster, server, config_file)
|
434
|
+
generated_config_file = pg_generate_config_file(cluster, server, config_file)
|
432
435
|
as 'root' do
|
433
|
-
if
|
436
|
+
if pg_file_exists?("#{server.conf_path}/#{config_file}")
|
434
437
|
capture("cat", "#{server.conf_path}/#{config_file}").chomp != generated_config_file.chomp
|
435
438
|
else
|
436
439
|
true
|
@@ -438,14 +441,14 @@ namespace :pg do
|
|
438
441
|
end
|
439
442
|
end
|
440
443
|
|
441
|
-
def
|
444
|
+
def pg_generate_config_file(cluster, server, config_file)
|
442
445
|
@cluster = cluster # needed for ERB
|
443
446
|
@server = server # needed for ERB
|
444
447
|
template_path = File.expand_path("templates/#{config_file}.erb")
|
445
448
|
ERB.new(File.new(template_path).read).result(binding)
|
446
449
|
end
|
447
450
|
|
448
|
-
def
|
451
|
+
def pg_role_exists?(cluster, server, role)
|
449
452
|
test("echo", "\"SELECT", "*", "FROM", "pg_user", "WHERE", "usename", "=", "'#{role}';\"", "|",
|
450
453
|
"docker", "run", "--rm", "--interactive",
|
451
454
|
"--entrypoint", "/bin/bash",
|
@@ -455,7 +458,7 @@ namespace :pg do
|
|
455
458
|
"grep", "-q", "'#{role}'")
|
456
459
|
end
|
457
460
|
|
458
|
-
def
|
461
|
+
def pg_database_exists?(cluster, server, database)
|
459
462
|
test "docker", "run", "--rm",
|
460
463
|
"--entrypoint", "/bin/bash",
|
461
464
|
"--volumes-from", server.container_name,
|
@@ -464,21 +467,21 @@ namespace :pg do
|
|
464
467
|
"cut", "-d\\|", "-f1", "|", "grep", "-w", "#{database.name}'"
|
465
468
|
end
|
466
469
|
|
467
|
-
def
|
470
|
+
def pg_container_exists?(server)
|
468
471
|
test "docker", "inspect", server.container_name, ">", "/dev/null"
|
469
472
|
end
|
470
473
|
|
471
|
-
def
|
474
|
+
def pg_container_is_running?(server)
|
472
475
|
(capture "docker", "inspect",
|
473
476
|
"--format='{{.State.Running}}'",
|
474
477
|
server.container_name).strip == "true"
|
475
478
|
end
|
476
479
|
|
477
|
-
def
|
480
|
+
def pg_file_exists?(file_name_path)
|
478
481
|
test "[", "-f", file_name_path, "]"
|
479
482
|
end
|
480
483
|
|
481
|
-
def
|
484
|
+
def pg_confirm_file_overwrite?(server, dump_file)
|
482
485
|
warn "A file named #{dump_file} already exists on #{server.domain} in /tmp. If you continue, you will overwrite it."
|
483
486
|
warn "Are you positive(Y/N)?"
|
484
487
|
STDOUT.flush
|
@@ -489,11 +492,11 @@ namespace :pg do
|
|
489
492
|
false
|
490
493
|
else
|
491
494
|
warn "Please enter Y or N"
|
492
|
-
|
495
|
+
pg_confirm_file_overwrite?(server, dump_file)
|
493
496
|
end
|
494
497
|
end
|
495
498
|
|
496
|
-
def
|
499
|
+
def pg_confirm_database_overwrite?(server, database)
|
497
500
|
warn "There is already data in #{database.name} on #{server.domain} in the container " +
|
498
501
|
"#{server.container_name} which stores it's data in #{server.data_path} on the host."
|
499
502
|
warn "If you continue, you must be positive you want to overwrite the existing data."
|
@@ -506,11 +509,11 @@ namespace :pg do
|
|
506
509
|
false
|
507
510
|
else
|
508
511
|
warn "Please enter Y or N"
|
509
|
-
|
512
|
+
pg_confirm_database_overwrite?(server, database)
|
510
513
|
end
|
511
514
|
end
|
512
515
|
|
513
|
-
def
|
516
|
+
def pg_database_empty?(cluster, server, database)
|
514
517
|
test("docker", "run", "--rm", "--volumes-from", server.container_name,
|
515
518
|
"--entrypoint", "/bin/bash", cluster.image.name, "-lc",
|
516
519
|
"'/usr/bin/psql", "-U", "postgres", "-d", database.name,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postgresinator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- david amick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|