db_configs = [] config.each do |env, target, data| db_configs << [env, target] unless data[:mariadb].nil? || data[:mariadb][:database].nil? end # Expects two hashes as parameters each with { :environment, :target, :name } set # :name is either environment:target or just the environment, if the is only one target def create_update_task(from, to) namespace to[:name] do task "from_#{from[:name]}" do # Add a bit of security if %w(live prod production).include?(to[:environment]) && !ARGV.include?('--force') ARGV.reject! { |param| param == '--force' } warning 'You are about to update the live database from another source.' print 'Are you sure? [y/N] ' answer = STDIN.gets exit if answer.downcase != 'y' end config.set(from[:environment], from[:target]) info 'Getting dump...' sql_dump = mariadb.download_dump if sql_dump == '' error 'Cannot create sql dump' else config.set(to[:environment], to[:target]) info 'Sending dump...' dump_path = config[:mariadb][:dump_path] || Fulmar::Plugin::MariaDB::Database::DEFAULT_CONFIG[:mariadb][:dump_path] remote_sql_dump = upload(sql_dump, dump_path) mariadb.load_dump(remote_sql_dump) end end end end def name(env, target, counts) (counts[env] <= 1 || target.nil?) ? env : "#{env}:#{target}" end def create_update_tasks(db_configs) counts = {} db_configs.each do |config| counts[config.first] = 0 unless counts[config.first] counts[config.first] += 1 end namespace :database do db_configs.each do |from_db| db_configs.each do |to_db| next if from_db == to_db # no need to sync a database to itself next if from_db.last != to_db.last # sync only matching target names from = { environment: from_db.first, target: from_db.last, name: name(from_db.first, nil, counts) } to = { environment: to_db.first, target: to_db.last, name: name(to_db.first, to_db.last, counts) } create_update_task(from, to) end end end end if db_configs.any? namespace :update do create_update_tasks(db_configs) if db_configs.count > 1 end end