test_mysql.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import sys
  2. from flexmock import flexmock
  3. from borgmatic.hooks import mysql as module
  4. def test_dump_databases_runs_mysqldump_for_each_database():
  5. databases = [{'name': 'foo'}, {'name': 'bar'}]
  6. output_file = flexmock()
  7. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  8. 'databases/localhost/foo'
  9. ).and_return('databases/localhost/bar')
  10. flexmock(module.os).should_receive('makedirs')
  11. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  12. for name in ('foo', 'bar'):
  13. flexmock(module).should_receive('execute_command').with_args(
  14. ('mysqldump', '--add-drop-database', '--databases', name),
  15. output_file=output_file,
  16. extra_environment=None,
  17. ).once()
  18. module.dump_databases(databases, 'test.yaml', dry_run=False)
  19. def test_dump_databases_with_dry_run_skips_mysqldump():
  20. databases = [{'name': 'foo'}, {'name': 'bar'}]
  21. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  22. 'databases/localhost/foo'
  23. ).and_return('databases/localhost/bar')
  24. flexmock(module.os).should_receive('makedirs').never()
  25. flexmock(module).should_receive('execute_command').never()
  26. module.dump_databases(databases, 'test.yaml', dry_run=True)
  27. def test_dump_databases_runs_mysqldump_with_hostname_and_port():
  28. databases = [{'name': 'foo', 'hostname': 'database.example.org', 'port': 5433}]
  29. output_file = flexmock()
  30. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  31. 'databases/database.example.org/foo'
  32. )
  33. flexmock(module.os).should_receive('makedirs')
  34. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  35. flexmock(module).should_receive('execute_command').with_args(
  36. (
  37. 'mysqldump',
  38. '--add-drop-database',
  39. '--host',
  40. 'database.example.org',
  41. '--port',
  42. '5433',
  43. '--protocol',
  44. 'tcp',
  45. '--databases',
  46. 'foo',
  47. ),
  48. output_file=output_file,
  49. extra_environment=None,
  50. ).once()
  51. module.dump_databases(databases, 'test.yaml', dry_run=False)
  52. def test_dump_databases_runs_mysqldump_with_username_and_password():
  53. databases = [{'name': 'foo', 'username': 'root', 'password': 'trustsome1'}]
  54. output_file = flexmock()
  55. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  56. 'databases/localhost/foo'
  57. )
  58. flexmock(module.os).should_receive('makedirs')
  59. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  60. flexmock(module).should_receive('execute_command').with_args(
  61. ('mysqldump', '--add-drop-database', '--user', 'root', '--databases', 'foo'),
  62. output_file=output_file,
  63. extra_environment={'MYSQL_PWD': 'trustsome1'},
  64. ).once()
  65. module.dump_databases(databases, 'test.yaml', dry_run=False)
  66. def test_dump_databases_runs_mysqldump_with_options():
  67. databases = [{'name': 'foo', 'options': '--stuff=such'}]
  68. output_file = flexmock()
  69. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  70. 'databases/localhost/foo'
  71. )
  72. flexmock(module.os).should_receive('makedirs')
  73. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  74. flexmock(module).should_receive('execute_command').with_args(
  75. ('mysqldump', '--add-drop-database', '--stuff=such', '--databases', 'foo'),
  76. output_file=output_file,
  77. extra_environment=None,
  78. ).once()
  79. module.dump_databases(databases, 'test.yaml', dry_run=False)
  80. def test_dump_databases_runs_mysqldump_for_all_databases():
  81. databases = [{'name': 'all'}]
  82. output_file = flexmock()
  83. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  84. 'databases/localhost/all'
  85. )
  86. flexmock(module.os).should_receive('makedirs')
  87. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  88. flexmock(module).should_receive('execute_command').with_args(
  89. ('mysqldump', '--add-drop-database', '--all-databases'),
  90. output_file=output_file,
  91. extra_environment=None,
  92. ).once()
  93. module.dump_databases(databases, 'test.yaml', dry_run=False)
  94. def test_make_database_dump_patterns_converts_names_to_glob_paths():
  95. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  96. 'databases/*/foo'
  97. ).and_return('databases/*/bar')
  98. assert module.make_database_dump_patterns(flexmock(), flexmock(), ('foo', 'bar')) == [
  99. 'databases/*/foo',
  100. 'databases/*/bar',
  101. ]
  102. def test_make_database_dump_patterns_treats_empty_names_as_matching_all_databases():
  103. flexmock(module.dump).should_receive('make_database_dump_filename').with_args(
  104. module.DUMP_PATH, '*', '*'
  105. ).and_return('databases/*/*')
  106. assert module.make_database_dump_patterns(flexmock(), flexmock(), ()) == ['databases/*/*']
  107. def test_restore_database_dumps_restores_each_database():
  108. databases = [{'name': 'foo'}, {'name': 'bar'}]
  109. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  110. 'databases/localhost/foo'
  111. ).and_return('databases/localhost/bar')
  112. for name in ('foo', 'bar'):
  113. dump_filename = 'databases/localhost/{}'.format(name)
  114. input_file = flexmock()
  115. flexmock(sys.modules['builtins']).should_receive('open').with_args(
  116. dump_filename
  117. ).and_return(input_file)
  118. flexmock(module).should_receive('execute_command').with_args(
  119. ('mysql', '--batch'), input_file=input_file, extra_environment=None
  120. ).once()
  121. module.restore_database_dumps(databases, 'test.yaml', dry_run=False)
  122. def test_restore_database_dumps_runs_mysql_with_hostname_and_port():
  123. databases = [{'name': 'foo', 'hostname': 'database.example.org', 'port': 5433}]
  124. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  125. 'databases/localhost/foo'
  126. )
  127. dump_filename = 'databases/localhost/foo'
  128. input_file = flexmock()
  129. flexmock(sys.modules['builtins']).should_receive('open').with_args(dump_filename).and_return(
  130. input_file
  131. )
  132. flexmock(module).should_receive('execute_command').with_args(
  133. (
  134. 'mysql',
  135. '--batch',
  136. '--host',
  137. 'database.example.org',
  138. '--port',
  139. '5433',
  140. '--protocol',
  141. 'tcp',
  142. ),
  143. input_file=input_file,
  144. extra_environment=None,
  145. ).once()
  146. module.restore_database_dumps(databases, 'test.yaml', dry_run=False)
  147. def test_restore_database_dumps_runs_mysql_with_username_and_password():
  148. databases = [{'name': 'foo', 'username': 'root', 'password': 'trustsome1'}]
  149. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  150. 'databases/localhost/foo'
  151. )
  152. dump_filename = 'databases/localhost/foo'
  153. input_file = flexmock()
  154. flexmock(sys.modules['builtins']).should_receive('open').with_args(dump_filename).and_return(
  155. input_file
  156. )
  157. flexmock(module).should_receive('execute_command').with_args(
  158. ('mysql', '--batch', '--user', 'root'),
  159. input_file=input_file,
  160. extra_environment={'MYSQL_PWD': 'trustsome1'},
  161. ).once()
  162. module.restore_database_dumps(databases, 'test.yaml', dry_run=False)