/tests/test_snapshot.py

https://github.com/aio-libs/aioes · Python · 159 lines · 117 code · 31 blank · 11 comment · 9 complexity · 8f1950ee11fe644c1f078ed4cc0cb06b MD5 · raw file

  1. import os
  2. import shutil
  3. import random
  4. import asyncio
  5. import tempfile
  6. import pytest
  7. from aioes import Elasticsearch
  8. from aioes.exception import NotFoundError
  9. INDEX = 'test_elasticsearch'
  10. @pytest.fixture
  11. def client(es_params, loop, repo_name, snapshot_name):
  12. client = Elasticsearch([{'host': es_params['host']}], loop=loop)
  13. try:
  14. loop.run_until_complete(client.delete(INDEX, '', ''))
  15. except NotFoundError:
  16. pass
  17. yield client
  18. # cleaning up just in case
  19. try:
  20. loop.run_until_complete(
  21. client.snapshot.delete(repo_name, snapshot_name))
  22. except NotFoundError:
  23. pass
  24. try:
  25. loop.run_until_complete(
  26. client.snapshot.delete_repository(repo_name))
  27. except NotFoundError:
  28. pass
  29. client.close()
  30. @pytest.fixture
  31. def repo_path():
  32. '''
  33. Sice elasticsearch may be launched under the other user,
  34. tempfile.TemporaryDirectory can't be used, because python
  35. can't cleanup it after elasticsearch user.
  36. So we are just leaving it there.
  37. '''
  38. characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
  39. temp_dir = tempfile.gettempdir()
  40. temp_prefix = '/' + tempfile.gettempprefix()
  41. temp_name = temp_prefix + ''.join(
  42. [random.choice(characters) for _ in range(8)]
  43. )
  44. dir_path = os.path.join(temp_dir + temp_name)
  45. os.makedirs(dir_path)
  46. yield dir_path
  47. try:
  48. shutil.rmtree(dir_path)
  49. except PermissionError:
  50. # if subdirs were created by other user
  51. pass
  52. @pytest.fixture
  53. def repo_name():
  54. return 'test_repo'
  55. @pytest.fixture
  56. def snapshot_name():
  57. return 'test_snapshot'
  58. @pytest.mark.xfail(reason="Elasticsearch setting repo.path must be configured")
  59. @asyncio.coroutine
  60. def test_repository(client, repo_path, repo_name):
  61. ret = yield from client.snapshot.get_repository()
  62. assert not ret
  63. b = {
  64. "type": "fs",
  65. "settings": {
  66. "location": repo_path,
  67. }
  68. }
  69. ret = yield from client.snapshot.create_repository(repo_name, b)
  70. assert ret['acknowledged']
  71. ret = yield from client.snapshot.get_repository(repo_name)
  72. assert ret[repo_name] == b
  73. ret = yield from client.snapshot.delete_repository(repo_name)
  74. assert ret['acknowledged']
  75. @pytest.mark.xfail(reason="Elasticsearch setting repo.path must be configured")
  76. @asyncio.coroutine
  77. def test_snapshot(client, repo_name, repo_path, snapshot_name):
  78. # creating index
  79. yield from client.create(
  80. INDEX, 'tweet',
  81. {
  82. 'user': 'Bob',
  83. },
  84. '1'
  85. )
  86. # creating repo
  87. repo_body = {
  88. "type": "fs",
  89. "settings": {
  90. "location": repo_path,
  91. }
  92. }
  93. ret = yield from client.snapshot.create_repository(
  94. repo_name, repo_body)
  95. assert ret['acknowledged']
  96. # creating snapshot
  97. yield from client.snapshot.create(
  98. repo_name, snapshot_name,
  99. wait_for_completion=True
  100. )
  101. # checking that snapshot was created
  102. ret = yield from client.snapshot.get(repo_name, snapshot_name)
  103. assert ret['snapshots'][0]['snapshot'] == snapshot_name
  104. assert ret['snapshots'][0]['state'] == 'SUCCESS'
  105. # restoring snapshot
  106. restore_body = {
  107. "indices": INDEX,
  108. }
  109. yield from client.indices.close(INDEX)
  110. ret = yield from client.snapshot.restore(
  111. repo_name, snapshot_name,
  112. body=restore_body
  113. )
  114. assert ret['accepted']
  115. # deleting snapshot
  116. ret = yield from client.snapshot.delete(
  117. repo_name, snapshot_name,
  118. )
  119. assert ret['acknowledged']
  120. # deleting repo
  121. ret = yield from client.snapshot.delete_repository(
  122. repo_name
  123. )
  124. assert ret['acknowledged']
  125. @asyncio.coroutine
  126. def test_status(client):
  127. ret = yield from client.snapshot.status()
  128. assert {'snapshots': []} == ret