ey_cloud_server 1.4.51 → 1.4.54
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 +13 -5
- data/Rakefile +1 -1
- data/features/downloading_a_mysql_backup.feature +2 -0
- data/features/making_a_postgresql_backup.feature +2 -0
- data/features/restoring_postgres_backup.feature +3 -1
- data/features/step_definitions/backups.rb +1 -1
- data/features/step_definitions/mysql.rb +6 -0
- data/features/step_definitions/postgresql.rb +3 -2
- data/lib/ey_backup/backend.rb +1 -1
- data/lib/ey_backup/backup_set.rb +3 -2
- data/lib/ey_backup/cli.rb +1 -2
- data/lib/ey_backup/database.rb +1 -1
- data/lib/ey_backup/engines/mysql_engine.rb +9 -12
- data/lib/ey_backup/engines/postgresql_engine.rb +15 -16
- data/lib/ey_backup/processors/splitter.rb +2 -0
- data/lib/ey_backup/spawner.rb +13 -4
- data/lib/ey_cloud_server/version.rb +1 -1
- data/lib/ey_cloud_server.rb +1 -0
- data/spec/config.yml +1 -1
- data/spec/ey_backup/backup_spec.rb +9 -4
- data/spec/ey_backup/cli_spec.rb +8 -1
- data/spec/ey_backup/mysql_backups_spec.rb +28 -6
- data/spec/ey_backup/postgres_backups_spec.rb +14 -4
- data/spec/helpers.rb +15 -4
- metadata +137 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
ZTdlYWY2NzRmNzI0YjA2ODVlNzBhYWM5ZTQyZTIzODJjMjEyMmJjYw==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
ZDkxZjUxMjA5Njc3MTI3NmViNmEwYmJhMDZlZjgwNTMyNTBkNWIzOQ==
|
|
5
7
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
YmQ1MDQwODBkMWNlYTFkMmI5NzM0YzdhM2UyYzVkNDQyZmNlODJjOTdkNDc0
|
|
10
|
+
YWM3ZjliNjFiZDhhMjc2MmFlZTRjMzU5MjUzY2FhNzQ0ZjkyYTUyZDQzMzM2
|
|
11
|
+
YTQwZjI3MzZmYTZhNTNlYTgzZDg2ZDFiNWNkMzg5ZDZlZDBjMzc=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
MDQwZWY0MzgzMGI4NTI2MTgyMGQ0ZWQ5MzRlM2EzOTI5ZWFlY2EzMzAxMmRi
|
|
14
|
+
MTAwNDI3YzI0ODU4YmY3YzliZTcxNmFlNmNjMWM0Y2I3YzYzMDNkODdmODEx
|
|
15
|
+
ZWM4YTk3NTM3NTM1MGMwZjcxYTc1ODYyM2Q5ZWY5YTRkZTg0YTQ=
|
data/Rakefile
CHANGED
|
@@ -7,7 +7,7 @@ require 'rspec/core/rake_task'
|
|
|
7
7
|
desc "Run unit specifications"
|
|
8
8
|
RSpec::Core::RakeTask.new do |t|
|
|
9
9
|
t.pattern = 'spec/**/*_spec.rb'
|
|
10
|
-
t.rspec_opts = %w(-
|
|
10
|
+
t.rspec_opts = %w(-fp --color --backtrace)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
require 'cucumber/rake/task'
|
|
@@ -4,9 +4,11 @@ Feature:
|
|
|
4
4
|
And backups for mysql are run
|
|
5
5
|
When backup "0" for the "first" database is downloaded
|
|
6
6
|
Then there is a backup file for the "first" database
|
|
7
|
+
And the "first" mysql database is dropped
|
|
7
8
|
|
|
8
9
|
Scenario: no database backup
|
|
9
10
|
Given there is a mysql database (first)
|
|
10
11
|
When backup "0" for the "first" database is downloaded
|
|
11
12
|
Then there is no backup file for the "first" database
|
|
12
13
|
And stderr contains "No backup found for database"
|
|
14
|
+
And the "first" mysql database is dropped
|
|
@@ -3,6 +3,7 @@ Feature:
|
|
|
3
3
|
Given there is a postgresql database (first)
|
|
4
4
|
When listing the backups for the "first" postgresql database
|
|
5
5
|
Then the output contains "0 backup(s) found"
|
|
6
|
+
And the "first" postgresql database is dropped
|
|
6
7
|
|
|
7
8
|
Scenario: a single backup run
|
|
8
9
|
Given there is a postgresql database (first)
|
|
@@ -10,3 +11,4 @@ Feature:
|
|
|
10
11
|
When listing the backups for the "first" postgresql database
|
|
11
12
|
Then the output contains "1 backup(s) found"
|
|
12
13
|
And the output contains "0:%s" substituting the "first" postgresql database
|
|
14
|
+
And the "first" postgresql database is dropped
|
|
@@ -3,10 +3,12 @@ Feature:
|
|
|
3
3
|
Given there is a postgresql database (first)
|
|
4
4
|
When backup "0" for the "first" database is restored
|
|
5
5
|
Then stderr contains "No backup found for database"
|
|
6
|
+
And the "first" postgresql database is dropped
|
|
6
7
|
|
|
7
8
|
Scenario: with a backup
|
|
8
9
|
Given there is a postgresql database (first)
|
|
9
10
|
And backups for postgresql are run
|
|
10
|
-
And the "first" database is dropped
|
|
11
|
+
And the "first" postgresql database is dropped
|
|
11
12
|
When backup "0" for the "first" database is restored
|
|
12
13
|
Then the "first" postgresql database exists
|
|
14
|
+
And the "first" postgresql database is dropped
|
|
@@ -28,7 +28,7 @@ When \
|
|
|
28
28
|
db_name = created_postgresql_dbs[db_key]
|
|
29
29
|
capturing_stdio do
|
|
30
30
|
EY::Backup.logger = EY::Backup::Logger.new
|
|
31
|
-
EY::Backup.run(["-e", "postgresql", "-r", "#{index}:#{db_name}", "-c", backup_config_file ])
|
|
31
|
+
EY::Backup.run(["-e", "postgresql", "-r", "#{index}:#{db_name}", "-c", backup_config_file, '--force' ])
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -10,6 +10,7 @@ Then \
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
Given \
|
|
13
|
-
/^the "([^\"]*)" database is dropped$/ do |db_key|
|
|
14
|
-
|
|
13
|
+
/^the "([^\"]*)" postgresql database is dropped$/ do |db_key|
|
|
14
|
+
db_name = created_postgresql_dbs[db_key]
|
|
15
|
+
drop_postgresql_database(db_name)
|
|
15
16
|
end
|
data/lib/ey_backup/backend.rb
CHANGED
|
@@ -15,7 +15,7 @@ module EY
|
|
|
15
15
|
def start_upload(filenames, environment_name, database_name)
|
|
16
16
|
filenames.each do |filename|
|
|
17
17
|
begin
|
|
18
|
-
object_name = "#{environment_name}.#{database_name}
|
|
18
|
+
object_name = File.join("#{environment_name}.#{database_name}", "#{File.basename(filename)}")
|
|
19
19
|
info "Starting upload: #{filename}"
|
|
20
20
|
@s3.put_object(@bucket_minder.bucket_name, object_name, File.open(filename,'r'))
|
|
21
21
|
info "Successful upload: #{filename}"
|
data/lib/ey_backup/backup_set.rb
CHANGED
|
@@ -38,10 +38,10 @@ module EY
|
|
|
38
38
|
|
|
39
39
|
backups = databases.map{ |db| db.backups }.flatten
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
puts "#{backups.size} backup(s) found"
|
|
42
42
|
|
|
43
43
|
backups.each_with_index do |backup_set, i|
|
|
44
|
-
|
|
44
|
+
puts "#{i}:#{backup_set.database_name} #{backup_set.normalized_name}"
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
backups
|
|
@@ -80,6 +80,7 @@ module EY
|
|
|
80
80
|
@keys.each do |key|
|
|
81
81
|
info "Downloading #{key} to #{@database.base_path}"
|
|
82
82
|
remote_filename = File.join(@database.base_path, normalize(key))
|
|
83
|
+
puts "Filename: #{remote_filename}"
|
|
83
84
|
File.open(remote_filename, 'wb') do |f|
|
|
84
85
|
@database.bucket_minder.stream(key) do |chunk, remaining_size, total_size|
|
|
85
86
|
f.write(chunk)
|
data/lib/ey_backup/cli.rb
CHANGED
|
@@ -36,9 +36,8 @@ module EY
|
|
|
36
36
|
|
|
37
37
|
opts = OptionParser.new do |opts|
|
|
38
38
|
opts.version = EY::CloudServer::VERSION
|
|
39
|
-
puts '' # add a blank line
|
|
40
39
|
|
|
41
|
-
opts.banner = "
|
|
40
|
+
opts.banner = "\nUsage: eybackup [-flag] [argument]"
|
|
42
41
|
opts.define_head " eybackup: manage dump (mysqldump/pg_dump) style backups of your database."
|
|
43
42
|
opts.separator '*'*80
|
|
44
43
|
|
data/lib/ey_backup/database.rb
CHANGED
|
@@ -73,27 +73,24 @@ module EY
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def db_has_myisam?(database_name)
|
|
76
|
-
query
|
|
77
|
-
|
|
78
|
-
stdout.
|
|
76
|
+
query = "SELECT 1 FROM information_schema.tables WHERE table_schema='#{database_name}' AND engine='MyISAM' LIMIT 1;"
|
|
77
|
+
stdout = %x{mysql #{username_option} #{host_option} -N -e"#{query}"}
|
|
78
|
+
stdout.strip == '1'
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def db_replicating?
|
|
82
|
-
stdout =
|
|
83
|
-
|
|
84
|
-
stdout.string.to_i > 0
|
|
82
|
+
stdout = %x{mysql #{username_option} #{host_option} -BN -e"show slave status"|wc -l}
|
|
83
|
+
stdout.to_i > 0
|
|
85
84
|
end
|
|
86
85
|
|
|
87
86
|
def read_only_on?
|
|
88
|
-
stdout =
|
|
89
|
-
|
|
90
|
-
stdout.string.to_i == 1
|
|
87
|
+
stdout = %x{mysql #{username_option} #{host_option} -BN -e"select @@global.read_only"}
|
|
88
|
+
stdout.to_i == 1
|
|
91
89
|
end
|
|
92
90
|
|
|
93
91
|
def log_bin_on?
|
|
94
|
-
stdout =
|
|
95
|
-
|
|
96
|
-
stdout.string.to_i == 1
|
|
92
|
+
stdout = %x{mysql #{username_option} #{host_option} -BN -e"select @@global.log_bin"}
|
|
93
|
+
stdout.to_i == 1
|
|
97
94
|
end
|
|
98
95
|
|
|
99
96
|
def cycle_database(database_name)
|
|
@@ -35,10 +35,9 @@ module EY
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def check_connections(database_name)
|
|
38
|
-
|
|
39
|
-
active_connections = spawn(%Q{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "select count(*) from pg_stat_activity where datname='#{database_name}';"}, stdout)
|
|
38
|
+
active_connections = %x{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "select count(*) from pg_stat_activity where datname='#{database_name}';"}
|
|
40
39
|
|
|
41
|
-
if
|
|
40
|
+
if active_connections.to_i > 0
|
|
42
41
|
res = ''
|
|
43
42
|
unless force
|
|
44
43
|
puts "There are currently #{stdout.string.to_i} connections on database: '#{database_name}'; can I kill these to continue (Y/n):"
|
|
@@ -56,31 +55,32 @@ module EY
|
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
def cancel_connections(database_name)
|
|
59
|
-
|
|
58
|
+
%x{psql -U postgres -h #{host} -c"SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
60
59
|
FROM pg_stat_activity
|
|
61
|
-
WHERE pg_stat_activity.datname = '#{database_name}';"}
|
|
60
|
+
WHERE pg_stat_activity.datname = '#{database_name}';"}
|
|
62
61
|
end
|
|
63
62
|
|
|
64
63
|
def drop_database(database_name)
|
|
65
|
-
|
|
64
|
+
command = "PGPASSWORD='#{password}' dropdb -h #{host} -Upostgres #{database_name}"
|
|
65
|
+
verbose "Dropping Database with: #{command}"
|
|
66
|
+
%x{#{command}}
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def create_database(database_name)
|
|
69
|
-
|
|
70
|
+
command = "PGPASSWORD='#{password}' createdb -U#{username} -h #{host} #{database_name}"
|
|
71
|
+
verbose "Creating Database with: #{command}"
|
|
72
|
+
%x{#{command}}
|
|
70
73
|
end
|
|
71
74
|
|
|
72
75
|
def check_if_replica
|
|
73
|
-
stdout =
|
|
74
|
-
|
|
75
|
-
unless stdout.string.chomp =~ /^\W*f$/
|
|
76
|
+
stdout = %x{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "select pg_is_in_recovery()"| head -n 1}
|
|
77
|
+
unless stdout.chomp =~ /^\W*f$/
|
|
76
78
|
EY::Backup.logger.fatal(%Q{ERROR: Target host: '#{host}' is currently a replica in recovery mode; restore operations need to be processed against the master.})
|
|
77
79
|
end
|
|
78
80
|
end
|
|
79
81
|
|
|
80
82
|
def create_command(database_name)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
spawn(%Q{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "SELECT 'CREATE DATABASE ' || datname ||
|
|
83
|
+
%x{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "SELECT 'CREATE DATABASE ' || datname ||
|
|
84
84
|
' WITH OWNER ' || pg_user.usename ||
|
|
85
85
|
CASE (select pg_encoding_to_char(encoding) from pg_database where datname='template1')
|
|
86
86
|
WHEN pg_encoding_to_char(encoding)
|
|
@@ -95,8 +95,7 @@ module EY
|
|
|
95
95
|
INNER JOIN pg_user
|
|
96
96
|
ON pg_user.usesysid = pg_database.datdba
|
|
97
97
|
WHERE datname = '#{database_name}'"
|
|
98
|
-
}
|
|
99
|
-
stdout.string
|
|
98
|
+
}
|
|
100
99
|
end
|
|
101
100
|
|
|
102
101
|
def cycle_database(database_name)
|
|
@@ -106,7 +105,7 @@ module EY
|
|
|
106
105
|
else
|
|
107
106
|
check_connections(database_name)
|
|
108
107
|
drop_database(database_name)
|
|
109
|
-
|
|
108
|
+
%x{PGPASSWORD='#{password}' psql -U postgres -h #{host} -t -c "#{create_cmd}"}
|
|
110
109
|
end
|
|
111
110
|
end
|
|
112
111
|
|
data/lib/ey_backup/spawner.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
1
3
|
module EY
|
|
2
4
|
module Backup
|
|
3
5
|
module Spawner
|
|
@@ -28,20 +30,27 @@ module EY
|
|
|
28
30
|
# This is to detect failures anywhere in the pipeline.
|
|
29
31
|
wrapper = <<-EOT
|
|
30
32
|
status=0
|
|
31
|
-
set -o pipefail
|
|
32
33
|
#{command}
|
|
33
34
|
status=$?
|
|
34
35
|
|
|
35
36
|
if [ $status -gt 0 ]; then exit 1; fi
|
|
36
37
|
EOT
|
|
37
38
|
|
|
39
|
+
escaped_command = Shellwords.escape(wrapper)
|
|
40
|
+
|
|
38
41
|
verbose "Running command: #{command}"
|
|
39
|
-
pid,
|
|
42
|
+
pid, stdin, stdout, stderr = Open4.popen4("bash -o pipefail -c #{escaped_command}")
|
|
40
43
|
pid, status = Process::waitpid2(pid)
|
|
41
44
|
|
|
45
|
+
verbose "stdout: #{stdout.read}"
|
|
46
|
+
verbose "stderr: #{stderr.read}"
|
|
47
|
+
verbose "status: #{status}"
|
|
48
|
+
|
|
42
49
|
if ! status.success?
|
|
43
|
-
dumperr = File.read("/tmp/eybackup.#{pid}.dumperr")
|
|
44
|
-
|
|
50
|
+
dumperr = File.exists?("/tmp/eybackup.#{pid}.dumperr") ? File.read("/tmp/eybackup.#{pid}.dumperr") : status
|
|
51
|
+
err_msg = "DB dump failed. The error returned was: #{dumperr}"
|
|
52
|
+
verbose "#{db} backup failed: #{err_msg}"
|
|
53
|
+
error(err_msg, db)
|
|
45
54
|
end
|
|
46
55
|
|
|
47
56
|
# Clean up:
|
data/lib/ey_cloud_server.rb
CHANGED
data/spec/config.yml
CHANGED
|
@@ -5,7 +5,7 @@ mysql_user: root
|
|
|
5
5
|
mysql_password:
|
|
6
6
|
mysql_host: localhost
|
|
7
7
|
postgresql_user: postgres
|
|
8
|
-
postgresql_password:
|
|
8
|
+
postgresql_password: grew152
|
|
9
9
|
postgresql_host: localhost
|
|
10
10
|
aws_secret_id: 'AKIAIDNXVLT3THIWYMNQ'
|
|
11
11
|
aws_secret_key: 'DZBOcAI1qpYF0V+ZL2SeA7Jzt15boFxIo+BD7vda'
|
|
@@ -4,21 +4,25 @@ describe EY::Backup do
|
|
|
4
4
|
before(:each) do
|
|
5
5
|
@db_name = create_mysql_database('first')
|
|
6
6
|
end
|
|
7
|
+
|
|
8
|
+
after(:each) do
|
|
9
|
+
drop_mysql_database(@db_name)
|
|
10
|
+
end
|
|
7
11
|
|
|
8
12
|
describe "#list" do
|
|
9
13
|
|
|
10
14
|
it 'prints the database to be listed first' do
|
|
11
|
-
EY::Backup.run([ "-c", backup_config_file
|
|
15
|
+
EY::Backup.run([ "-c", backup_config_file])
|
|
12
16
|
|
|
13
17
|
reset_logger
|
|
14
18
|
|
|
15
19
|
EY::Backup.run(["-c", backup_config_file, "-l", @db_name])
|
|
16
20
|
|
|
17
|
-
stdout.should =~
|
|
21
|
+
stdout.should =~ /Listing database backups for #{@db_name}$/
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
it 'conforms to the /^\d:#{db_name} #{db_name}\.#{timestamp}\.#{ext}$/ line output' do
|
|
21
|
-
EY::Backup.run([ "-c", backup_config_file
|
|
25
|
+
EY::Backup.run([ "-c", backup_config_file])
|
|
22
26
|
|
|
23
27
|
reset_logger
|
|
24
28
|
|
|
@@ -32,7 +36,7 @@ describe EY::Backup do
|
|
|
32
36
|
it 'prints all the database names' do
|
|
33
37
|
@db_name2 = create_mysql_database('second')
|
|
34
38
|
|
|
35
|
-
EY::Backup.run([ "-c", backup_config_file
|
|
39
|
+
EY::Backup.run([ "-c", backup_config_file])
|
|
36
40
|
|
|
37
41
|
reset_logger
|
|
38
42
|
|
|
@@ -40,6 +44,7 @@ describe EY::Backup do
|
|
|
40
44
|
|
|
41
45
|
stdout.should =~ /^\d+:#{@db_name}/
|
|
42
46
|
stdout.should =~ /^\d+:#{@db_name2}/
|
|
47
|
+
drop_mysql_database(@db_name2)
|
|
43
48
|
end
|
|
44
49
|
end
|
|
45
50
|
|
data/spec/ey_backup/cli_spec.rb
CHANGED
|
@@ -4,6 +4,10 @@ describe "MySQL Backups" do
|
|
|
4
4
|
before(:each) do
|
|
5
5
|
@db_name = create_mysql_database('first')
|
|
6
6
|
end
|
|
7
|
+
|
|
8
|
+
after(:each) do
|
|
9
|
+
drop_mysql_database(@db_name)
|
|
10
|
+
end
|
|
7
11
|
|
|
8
12
|
describe "--quiet" do
|
|
9
13
|
it "does not print anything to STDOUT" do
|
|
@@ -11,8 +15,11 @@ describe "MySQL Backups" do
|
|
|
11
15
|
reset_logger
|
|
12
16
|
EY::Backup.run(["-c", backup_config_file, '--quiet'])
|
|
13
17
|
end
|
|
18
|
+
|
|
19
|
+
possibly = last_stdout
|
|
20
|
+
puts "last_stdout == '#{possibly}'"
|
|
21
|
+
possibly.should be_empty
|
|
14
22
|
|
|
15
|
-
last_stdout.should be_empty
|
|
16
23
|
end
|
|
17
24
|
|
|
18
25
|
it 'does print to STDOUT without the flag' do
|
|
@@ -3,10 +3,18 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
|
3
3
|
describe "MySQL Backups" do
|
|
4
4
|
before(:each) do
|
|
5
5
|
@db_name = create_mysql_database('first')
|
|
6
|
+
mk_tmp
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
after(:each) do
|
|
10
|
+
drop_mysql_database(@db_name)
|
|
6
11
|
end
|
|
7
12
|
|
|
8
13
|
it "makes a backup" do
|
|
9
|
-
|
|
14
|
+
result = capturing_stdio do
|
|
15
|
+
EY::Backup.run(["-c", backup_config_file])
|
|
16
|
+
end
|
|
17
|
+
puts "MySQL Command: #{result}"
|
|
10
18
|
|
|
11
19
|
reset_logger
|
|
12
20
|
|
|
@@ -35,7 +43,7 @@ describe "MySQL Backups" do
|
|
|
35
43
|
run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true
|
|
36
44
|
run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true
|
|
37
45
|
|
|
38
|
-
EY::Backup.run(["-c", backup_config_file ])
|
|
46
|
+
EY::Backup.run(["-c", backup_config_file, '-v' ])
|
|
39
47
|
|
|
40
48
|
run_sql("DROP TABLE `bar`;", @db_name).should be_true
|
|
41
49
|
run_sql("SELECT * FROM `bar`;", @db_name).should be_false
|
|
@@ -46,7 +54,7 @@ describe "MySQL Backups" do
|
|
|
46
54
|
|
|
47
55
|
stdout.should include("1 backup(s) found")
|
|
48
56
|
|
|
49
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}"])
|
|
57
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", "--force"])
|
|
50
58
|
|
|
51
59
|
run_sql("SELECT * FROM `foo`;", @db_name).should be_true
|
|
52
60
|
run_sql("SELECT * FROM `bar`;", @db_name).should be_true
|
|
@@ -68,7 +76,7 @@ describe "MySQL Backups" do
|
|
|
68
76
|
|
|
69
77
|
stdout.should include("1 backup(s) found")
|
|
70
78
|
|
|
71
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}"])
|
|
79
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force'])
|
|
72
80
|
|
|
73
81
|
run_sql("SELECT * FROM `foo`;", @db_name).should be_true
|
|
74
82
|
run_sql("SELECT * FROM `bar`;", @db_name).should be_true
|
|
@@ -123,6 +131,12 @@ describe "MySQL Backups" do
|
|
|
123
131
|
before(:each) do
|
|
124
132
|
@dbs = [create_mysql_database('first'), create_mysql_database('second')]
|
|
125
133
|
end
|
|
134
|
+
|
|
135
|
+
after(:each) do
|
|
136
|
+
@dbs.each do |db|
|
|
137
|
+
drop_mysql_database(db)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
126
140
|
|
|
127
141
|
it "makes a backup" do
|
|
128
142
|
EY::Backup.run(["-c", backup_config_file ])
|
|
@@ -141,6 +155,10 @@ describe "a multi-region backup" do
|
|
|
141
155
|
before(:each) do
|
|
142
156
|
@db_name = create_mysql_database('speaking_japanese', 'ap-northeast-1')
|
|
143
157
|
end
|
|
158
|
+
|
|
159
|
+
after(:each) do
|
|
160
|
+
drop_mysql_database(@db_name)
|
|
161
|
+
end
|
|
144
162
|
|
|
145
163
|
it "makes a split backup" do
|
|
146
164
|
EY::Backup.run(["-c", backup_config_file, "-s", "100"])
|
|
@@ -165,7 +183,7 @@ describe "a multi-region backup" do
|
|
|
165
183
|
|
|
166
184
|
stdout.should include("1 backup(s) found")
|
|
167
185
|
|
|
168
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}"])
|
|
186
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force'])
|
|
169
187
|
|
|
170
188
|
run_sql("SELECT * FROM `foo`;", @db_name).should be_true
|
|
171
189
|
run_sql("SELECT * FROM `bar`;", @db_name).should be_true
|
|
@@ -176,6 +194,10 @@ describe "a multi-region backup" do
|
|
|
176
194
|
before(:each) do
|
|
177
195
|
@db_name = create_mysql_database('speaking_esperanto', 'eu-west-1')
|
|
178
196
|
end
|
|
197
|
+
|
|
198
|
+
after(:each) do
|
|
199
|
+
drop_mysql_database(@db_name)
|
|
200
|
+
end
|
|
179
201
|
|
|
180
202
|
it "makes a split backup" do
|
|
181
203
|
EY::Backup.run(["-c", backup_config_file, "-s", "100"])
|
|
@@ -200,7 +222,7 @@ describe "a multi-region backup" do
|
|
|
200
222
|
|
|
201
223
|
stdout.should include("1 backup(s) found")
|
|
202
224
|
|
|
203
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}"])
|
|
225
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force'])
|
|
204
226
|
|
|
205
227
|
run_sql("SELECT * FROM `foo`;", @db_name).should be_true
|
|
206
228
|
run_sql("SELECT * FROM `bar`;", @db_name).should be_true
|
|
@@ -4,6 +4,10 @@ describe "Postgres Backups" do
|
|
|
4
4
|
before(:each) do
|
|
5
5
|
@db_name = create_postgresql_database('first')
|
|
6
6
|
end
|
|
7
|
+
|
|
8
|
+
after(:each) do
|
|
9
|
+
drop_postgresql_database(@db_name)
|
|
10
|
+
end
|
|
7
11
|
|
|
8
12
|
it "makes a custom format backup" do
|
|
9
13
|
EY::Backup.run(["-c", backup_config_file, "-e", "postgresql"])
|
|
@@ -47,7 +51,7 @@ describe "Postgres Backups" do
|
|
|
47
51
|
|
|
48
52
|
stdout.should include("1 backup(s) found")
|
|
49
53
|
|
|
50
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '-e', 'postgresql'])
|
|
54
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '-e', 'postgresql', '--force'])
|
|
51
55
|
|
|
52
56
|
run_psql("SELECT * FROM foo;", @db_name).should be_true
|
|
53
57
|
run_psql("SELECT * FROM bar;", @db_name).should be_true
|
|
@@ -66,9 +70,9 @@ describe "Postgres Backups" do
|
|
|
66
70
|
EY::Backup.run(["-c", backup_config_file, "-l", @db_name, '-e', 'postgresql'])
|
|
67
71
|
|
|
68
72
|
stdout.should include("1 backup(s) found")
|
|
69
|
-
|
|
70
|
-
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '-e', 'postgresql'])
|
|
71
|
-
|
|
73
|
+
|
|
74
|
+
EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '-e', 'postgresql', '--force'])
|
|
75
|
+
|
|
72
76
|
run_psql("SELECT * FROM foo;", @db_name).should be_true
|
|
73
77
|
run_psql("SELECT * FROM bar;", @db_name).should be_true
|
|
74
78
|
end
|
|
@@ -92,6 +96,12 @@ describe "Postgresql Backups" do
|
|
|
92
96
|
before(:each) do
|
|
93
97
|
@dbs = [create_postgresql_database('first'), create_postgresql_database('second')]
|
|
94
98
|
end
|
|
99
|
+
|
|
100
|
+
after(:each) do
|
|
101
|
+
@dbs.each do |db|
|
|
102
|
+
drop_postgresql_database(db)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
95
105
|
|
|
96
106
|
it "makes multiple backup" do
|
|
97
107
|
EY::Backup.run(["-c", backup_config_file, "-e", "postgresql"])
|
data/spec/helpers.rb
CHANGED
|
@@ -80,13 +80,17 @@ module Helpers
|
|
|
80
80
|
def backup_config_file
|
|
81
81
|
"#{tmp_dir}/spec_backups.yml"
|
|
82
82
|
end
|
|
83
|
+
|
|
84
|
+
def mk_tmp
|
|
85
|
+
FileUtils.mkdir_p("/tmp")
|
|
86
|
+
end
|
|
83
87
|
|
|
84
88
|
def mysql_password_option
|
|
85
89
|
mysql_password.nil? ? "" : "-p#{mysql_password}"
|
|
86
90
|
end
|
|
87
91
|
|
|
88
92
|
def generate_database_name(type)
|
|
89
|
-
"ey_flex_#{type}_db_#{/\w{5,7}/.gen}"
|
|
93
|
+
"ey_flex_#{type}_db_#{/\w{5,7}/.gen}".downcase
|
|
90
94
|
end
|
|
91
95
|
|
|
92
96
|
def create_mysql_database(db_key, region = 'us-east-1')
|
|
@@ -94,13 +98,20 @@ module Helpers
|
|
|
94
98
|
system(%Q{mysql -u#{mysql_user} -h#{mysql_host} #{mysql_password_option} -e "drop database if exists #{db_name};"})
|
|
95
99
|
system(%Q{mysql -u#{mysql_user} -h#{mysql_host} #{mysql_password_option} -e "create database #{db_name};"}) || raise("Could not create db: #{db_name}")
|
|
96
100
|
created_mysql_dbs[db_key] = db_name
|
|
101
|
+
puts "*** MySQL DB Created: #{db_name}"
|
|
97
102
|
write_database_config('mysql', mysql_user, mysql_password, mysql_host, created_mysql_dbs.values, region)
|
|
98
103
|
db_name
|
|
99
104
|
end
|
|
105
|
+
|
|
106
|
+
def drop_mysql_database(db_name)
|
|
107
|
+
command = %Q{mysql -u#{mysql_user} -h#{mysql_host} #{mysql_password_option} -e "drop database if exists #{db_name};"}
|
|
108
|
+
puts "*** MySQL Drop Command: #{command}"
|
|
109
|
+
system(command)
|
|
110
|
+
end
|
|
100
111
|
|
|
101
|
-
def drop_postgresql_database(
|
|
102
|
-
db_name = created_postgresql_dbs[db_key]
|
|
112
|
+
def drop_postgresql_database(db_name)
|
|
103
113
|
command = %Q{ PGPASSWORD='#{postgresql_password}' dropdb -U #{postgresql_user} -h #{postgresql_host} #{db_name} }
|
|
114
|
+
puts "Postgres Drop Command: #{command}"
|
|
104
115
|
system(command)
|
|
105
116
|
end
|
|
106
117
|
|
|
@@ -113,7 +124,7 @@ module Helpers
|
|
|
113
124
|
def create_postgresql_database(db_key, region = 'us-east-1')
|
|
114
125
|
db_name = generate_database_name('postgresql')
|
|
115
126
|
created_postgresql_dbs[db_key] = db_name
|
|
116
|
-
drop_postgresql_database(
|
|
127
|
+
drop_postgresql_database(db_name)
|
|
117
128
|
command = %Q{ PGPASSWORD='#{postgresql_password}' createdb -U #{postgresql_user} -h #{postgresql_host} #{db_name} }
|
|
118
129
|
system(command) || raise("Could not create db: #{db_name} with command:\n #{command}")
|
|
119
130
|
write_database_config('postgresql', postgresql_user, postgresql_password, postgresql_host, created_postgresql_dbs.values, region)
|
metadata
CHANGED
|
@@ -1,127 +1,237 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ey_cloud_server
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.4.
|
|
4
|
+
version: 1.4.54
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- EngineYard
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-01-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ! '>='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.
|
|
19
|
+
version: 1.5.5
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - ! '>='
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 1.
|
|
26
|
+
version: 1.5.5
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: open4
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ~>
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: 1.3.0
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ~>
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 1.3.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: nokogiri
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ! '>='
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: 1.6.6.2
|
|
48
|
+
- - <=
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: 1.6.8.1
|
|
48
51
|
type: :runtime
|
|
49
52
|
prerelease: false
|
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
54
|
requirements:
|
|
52
|
-
- -
|
|
55
|
+
- - ! '>='
|
|
53
56
|
- !ruby/object:Gem::Version
|
|
54
57
|
version: 1.6.6.2
|
|
58
|
+
- - <=
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: 1.6.8.1
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: mime-types
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ! '>='
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.16'
|
|
68
|
+
- - <
|
|
69
|
+
- !ruby/object:Gem::Version
|
|
70
|
+
version: '3.0'
|
|
71
|
+
type: :runtime
|
|
72
|
+
prerelease: false
|
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '1.16'
|
|
78
|
+
- - <
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '3.0'
|
|
55
81
|
- !ruby/object:Gem::Dependency
|
|
56
82
|
name: aws-s3
|
|
57
83
|
requirement: !ruby/object:Gem::Requirement
|
|
58
84
|
requirements:
|
|
59
|
-
- -
|
|
85
|
+
- - ! '>='
|
|
60
86
|
- !ruby/object:Gem::Version
|
|
61
87
|
version: 0.6.3
|
|
62
88
|
type: :runtime
|
|
63
89
|
prerelease: false
|
|
64
90
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
91
|
requirements:
|
|
66
|
-
- -
|
|
92
|
+
- - ! '>='
|
|
67
93
|
- !ruby/object:Gem::Version
|
|
68
94
|
version: 0.6.3
|
|
69
95
|
- !ruby/object:Gem::Dependency
|
|
70
96
|
name: fog-aws
|
|
71
97
|
requirement: !ruby/object:Gem::Requirement
|
|
72
98
|
requirements:
|
|
73
|
-
- -
|
|
99
|
+
- - ! '>='
|
|
74
100
|
- !ruby/object:Gem::Version
|
|
75
101
|
version: 0.3.0
|
|
76
102
|
type: :runtime
|
|
77
103
|
prerelease: false
|
|
78
104
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
105
|
requirements:
|
|
80
|
-
- -
|
|
106
|
+
- - ! '>='
|
|
81
107
|
- !ruby/object:Gem::Version
|
|
82
108
|
version: 0.3.0
|
|
83
109
|
- !ruby/object:Gem::Dependency
|
|
84
110
|
name: ey_enzyme
|
|
85
111
|
requirement: !ruby/object:Gem::Requirement
|
|
86
112
|
requirements:
|
|
87
|
-
- -
|
|
113
|
+
- - ! '>='
|
|
88
114
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.1.
|
|
115
|
+
version: 1.1.10
|
|
90
116
|
type: :runtime
|
|
91
117
|
prerelease: false
|
|
92
118
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
119
|
requirements:
|
|
94
|
-
- -
|
|
120
|
+
- - ! '>='
|
|
95
121
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: 1.1.
|
|
122
|
+
version: 1.1.10
|
|
97
123
|
- !ruby/object:Gem::Dependency
|
|
98
124
|
name: ey_instance_api_client
|
|
99
125
|
requirement: !ruby/object:Gem::Requirement
|
|
100
126
|
requirements:
|
|
101
|
-
- -
|
|
127
|
+
- - ~>
|
|
102
128
|
- !ruby/object:Gem::Version
|
|
103
129
|
version: 0.1.11
|
|
104
130
|
type: :runtime
|
|
105
131
|
prerelease: false
|
|
106
132
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
133
|
requirements:
|
|
108
|
-
- -
|
|
134
|
+
- - ~>
|
|
109
135
|
- !ruby/object:Gem::Version
|
|
110
136
|
version: 0.1.11
|
|
111
137
|
- !ruby/object:Gem::Dependency
|
|
112
138
|
name: rake
|
|
113
139
|
requirement: !ruby/object:Gem::Requirement
|
|
114
140
|
requirements:
|
|
115
|
-
- -
|
|
141
|
+
- - ~>
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: 10.4.2
|
|
144
|
+
type: :development
|
|
145
|
+
prerelease: false
|
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - ~>
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: 10.4.2
|
|
151
|
+
- !ruby/object:Gem::Dependency
|
|
152
|
+
name: rspec
|
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
|
154
|
+
requirements:
|
|
155
|
+
- - ~>
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '2.0'
|
|
158
|
+
type: :development
|
|
159
|
+
prerelease: false
|
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - ~>
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '2.0'
|
|
165
|
+
- !ruby/object:Gem::Dependency
|
|
166
|
+
name: randexp
|
|
167
|
+
requirement: !ruby/object:Gem::Requirement
|
|
168
|
+
requirements:
|
|
169
|
+
- - ~>
|
|
170
|
+
- !ruby/object:Gem::Version
|
|
171
|
+
version: 0.1.7
|
|
172
|
+
type: :development
|
|
173
|
+
prerelease: false
|
|
174
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
175
|
+
requirements:
|
|
176
|
+
- - ~>
|
|
177
|
+
- !ruby/object:Gem::Version
|
|
178
|
+
version: 0.1.7
|
|
179
|
+
- !ruby/object:Gem::Dependency
|
|
180
|
+
name: cucumber
|
|
181
|
+
requirement: !ruby/object:Gem::Requirement
|
|
182
|
+
requirements:
|
|
183
|
+
- - ~>
|
|
184
|
+
- !ruby/object:Gem::Version
|
|
185
|
+
version: 2.4.0
|
|
186
|
+
type: :development
|
|
187
|
+
prerelease: false
|
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
189
|
+
requirements:
|
|
190
|
+
- - ~>
|
|
191
|
+
- !ruby/object:Gem::Version
|
|
192
|
+
version: 2.4.0
|
|
193
|
+
- !ruby/object:Gem::Dependency
|
|
194
|
+
name: fakeweb
|
|
195
|
+
requirement: !ruby/object:Gem::Requirement
|
|
196
|
+
requirements:
|
|
197
|
+
- - '='
|
|
198
|
+
- !ruby/object:Gem::Version
|
|
199
|
+
version: 1.2.6.ninjas
|
|
200
|
+
type: :development
|
|
201
|
+
prerelease: false
|
|
202
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
203
|
+
requirements:
|
|
204
|
+
- - '='
|
|
205
|
+
- !ruby/object:Gem::Version
|
|
206
|
+
version: 1.2.6.ninjas
|
|
207
|
+
- !ruby/object:Gem::Dependency
|
|
208
|
+
name: fakefs
|
|
209
|
+
requirement: !ruby/object:Gem::Requirement
|
|
210
|
+
requirements:
|
|
211
|
+
- - '='
|
|
212
|
+
- !ruby/object:Gem::Version
|
|
213
|
+
version: 0.0.1.ninjas
|
|
214
|
+
type: :development
|
|
215
|
+
prerelease: false
|
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
217
|
+
requirements:
|
|
218
|
+
- - '='
|
|
219
|
+
- !ruby/object:Gem::Version
|
|
220
|
+
version: 0.0.1.ninjas
|
|
221
|
+
- !ruby/object:Gem::Dependency
|
|
222
|
+
name: bundler
|
|
223
|
+
requirement: !ruby/object:Gem::Requirement
|
|
224
|
+
requirements:
|
|
225
|
+
- - ~>
|
|
116
226
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
227
|
+
version: 1.13.7
|
|
118
228
|
type: :development
|
|
119
229
|
prerelease: false
|
|
120
230
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
231
|
requirements:
|
|
122
|
-
- -
|
|
232
|
+
- - ~>
|
|
123
233
|
- !ruby/object:Gem::Version
|
|
124
|
-
version:
|
|
234
|
+
version: 1.13.7
|
|
125
235
|
description: Miscellaneous EY server utilities
|
|
126
236
|
email:
|
|
127
237
|
- engineering@engineyard.com
|
|
@@ -192,17 +302,17 @@ require_paths:
|
|
|
192
302
|
- lib
|
|
193
303
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
304
|
requirements:
|
|
195
|
-
- -
|
|
305
|
+
- - ! '>='
|
|
196
306
|
- !ruby/object:Gem::Version
|
|
197
307
|
version: '0'
|
|
198
308
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
309
|
requirements:
|
|
200
|
-
- -
|
|
310
|
+
- - ! '>='
|
|
201
311
|
- !ruby/object:Gem::Version
|
|
202
312
|
version: '0'
|
|
203
313
|
requirements: []
|
|
204
314
|
rubyforge_project:
|
|
205
|
-
rubygems_version: 2.
|
|
315
|
+
rubygems_version: 2.6.8
|
|
206
316
|
signing_key:
|
|
207
317
|
specification_version: 4
|
|
208
318
|
summary: Server side components for Engine Yard's cloud
|