require File.dirname(__FILE__) + '/spec_helper' describe "MySQL Backups" do before(:each) do @db_name = create_mysql_database('first') setup_dna({:db_stack_name => "mysql5_5"}) mk_tmp end after(:each) do drop_mysql_database(@db_name) teardown_dna end it "makes a backup" do result = capturing_stdio do EY::Backup.run(["-c", backup_config_file]) end puts "MySQL Command: #{result}" reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should match(/0:#{@db_name}/) end it "makes a split backup" do EY::Backup.run(["-c", backup_config_file, "-s", "100"]) backup = EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first backup.parts.should > 1 end it "makes GPG encrypted backups" do import_gpg EY::Backup.run(["-c", backup_config_file, '-k', Helpers::PUBLIC_KEY_ID]) EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should match(/0:#{@db_name}/) end it "restores a backup" do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true EY::Backup.run(["-c", backup_config_file, '-v' ]) run_sql("DROP TABLE `bar`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_false reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should include("1 backup(s) found") EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", "--force"]) run_sql("SELECT * FROM `foo`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_true end it "restores a split backup" do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true EY::Backup.run(["-c", backup_config_file, '-s', '100']) EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first.parts.should > 1 run_sql("DROP TABLE `bar`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_false reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should include("1 backup(s) found") EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force']) run_sql("SELECT * FROM `foo`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_true end it "downloads a split backup to 1 file" do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true EY::Backup.run(["-c", backup_config_file, '-s', '100']) EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first.parts.should > 1 EY::Backup.run(["-c", backup_config_file, "--download", "0:#{@db_name}"]) files = Dir["#{EY::Backup.tmp_dir}/*#{@db_name}*"] files.size.should == 1 FileUtils.rm(files.first) end it 'manually restores an encrypted backup' do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true import_gpg EY::Backup.run(["-c", backup_config_file, '-k', Helpers::PUBLIC_KEY_ID]) run_sql("DROP TABLE `bar`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_false reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should include("1 backup(s) found") EY::Backup.run(["-c", backup_config_file, "--download", "0:#{@db_name}"]) file = Dir["#{EY::Backup.tmp_dir}/*#{@db_name}*"].first stdout = StringIO.new EY::Backup::Spawner.spawn("gpg --no-default-keyring --keyring #{Helpers::PUBLIC_KEY_PATH} --secret-keyring #{Helpers::PRIVATE_KEY_PATH} --decrypt", stdout, file) stdout.rewind run_sql_pipe(stdout, @db_name) run_sql("SELECT * FROM `foo`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_true FileUtils.rm(file) end it 'detects a backup failure due to an invalid view definition and reports it to stdout' do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_truthy run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_truthy run_sql("CREATE view `vw_foobar` as select `foo`.`id` as `foo_id`, `bar`.`id` as `bar_id` from `foo` inner join `bar` on `foo`.`id` = `bar`.`id`;", @db_name).should be_truthy run_sql("DROP TABLE `bar`;", @db_name).should be_truthy reset_logger EY::Backup.run(["-c", backup_config_file]) stdout.should match(/mysqldump: Couldn't execute 'SHOW FIELDS FROM `vw_foobar`'/) files = Dir["#{EY::Backup.tmp_dir}/*#{@db_name}*"] files.size.should == 1 FileUtils.rm(files.first) end end describe "MySQL Backups" do before(:each) do @dbs = [create_mysql_database('first'), create_mysql_database('second')] setup_dna({:db_stack_name => "mysql5_5"}) end after(:each) do @dbs.each do |db| drop_mysql_database(db) end teardown_dna end it "makes a backup" do EY::Backup.run(["-c", backup_config_file ]) reset_logger @dbs.each do |db_name| EY::Backup.run(["-c", backup_config_file, "-l", db_name]) stdout.should match(/0:#{db_name}/) end end end describe "a multi-region backup" do describe "in japan!" do before(:each) do @db_name = create_mysql_database('speaking_japanese', 'ap-northeast-1') setup_dna({:db_stack_name => "mysql5_5"}) end after(:each) do drop_mysql_database(@db_name) teardown_dna end it "makes a split backup" do EY::Backup.run(["-c", backup_config_file, "-s", "100"]) backup = EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first backup.parts.should > 1 end it "restores a split backup" do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true EY::Backup.run(["-c", backup_config_file, '-s', '100']) EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first.parts.should > 1 run_sql("DROP TABLE `bar`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_false reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should include("1 backup(s) found") EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force']) run_sql("SELECT * FROM `foo`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_true end end describe "in europe!" do before(:each) do @db_name = create_mysql_database('speaking_esperanto', 'eu-west-1') setup_dna({:db_stack_name => "mysql5_5"}) end after(:each) do drop_mysql_database(@db_name) teardown_dna end it "makes a split backup" do EY::Backup.run(["-c", backup_config_file, "-s", "100"]) backup = EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first backup.parts.should > 1 end it "restores a split backup" do run_sql("CREATE TABLE `foo` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true run_sql("CREATE TABLE `bar` (`id` int(11) NOT NULL auto_increment, PRIMARY KEY(`id`));", @db_name).should be_true EY::Backup.run(["-c", backup_config_file, '-s', '100']) EY::Backup.run(["-c", backup_config_file, "-l", @db_name]).first.parts.should > 1 run_sql("DROP TABLE `bar`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_false reset_logger EY::Backup.run(["-c", backup_config_file, "-l", @db_name]) stdout.should include("1 backup(s) found") EY::Backup.run(["-c", backup_config_file, "-r", "0:#{@db_name}", '--force']) run_sql("SELECT * FROM `foo`;", @db_name).should be_true run_sql("SELECT * FROM `bar`;", @db_name).should be_true end end end