IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

156 строки
4.6KB

  1. from focker.compose import exec_hook, \
  2. exec_prebuild, \
  3. exec_postbuild, \
  4. build_volumes, \
  5. build_images
  6. from tempfile import TemporaryDirectory
  7. import os
  8. import pytest
  9. import fcntl
  10. from focker.misc import focker_lock, \
  11. focker_unlock
  12. import inspect
  13. import ast
  14. import stat
  15. from focker.zfs import zfs_find, \
  16. zfs_mountpoint, \
  17. zfs_parse_output
  18. import subprocess
  19. import yaml
  20. def test_exec_hook_01():
  21. spec = [
  22. 'touch test-exec-hook-01',
  23. 'touch test-exec-hook-02'
  24. ]
  25. with TemporaryDirectory() as d:
  26. exec_hook(spec, d, 'test-exec-hook')
  27. assert os.path.exists(os.path.join(d, 'test-exec-hook-01'))
  28. assert os.path.exists(os.path.join(d, 'test-exec-hook-02'))
  29. assert not os.path.exists(d)
  30. def test_exec_hook_02():
  31. spec = 'touch test-exec-hook-01 && touch test-exec-hook-02'
  32. with TemporaryDirectory() as d:
  33. exec_hook(spec, d, 'test-exec-hook')
  34. assert os.path.exists(os.path.join(d, 'test-exec-hook-01'))
  35. assert os.path.exists(os.path.join(d, 'test-exec-hook-02'))
  36. assert not os.path.exists(d)
  37. @pytest.mark.xfail(raises=ValueError, strict=True)
  38. def test_exec_hook_03a():
  39. spec = 1
  40. with TemporaryDirectory() as d:
  41. exec_hook(spec, d, 'test-exec-hook')
  42. @pytest.mark.xfail(raises=TypeError, strict=True)
  43. def test_exec_hook_03b():
  44. spec = [1]
  45. with TemporaryDirectory() as d:
  46. exec_hook(spec, d, 'test-exec-hook')
  47. @pytest.mark.xfail(raises=FileNotFoundError, strict=True)
  48. def test_exec_hook_04():
  49. spec = 'ls'
  50. exec_hook(spec, '/non-existent-directory/wcj20fy103', 'test-exec-hook')
  51. def test_exec_hook_05():
  52. spec = 'ls'
  53. oldwd = os.getcwd()
  54. with TemporaryDirectory() as d:
  55. exec_hook(spec, d, 'test-exec-hook')
  56. assert os.getcwd() == oldwd
  57. @pytest.mark.xfail(raises=RuntimeError, strict=True)
  58. def test_exec_hook_06():
  59. spec = '/non-existent-command/hf249h'
  60. with TemporaryDirectory() as d:
  61. exec_hook(spec, d, 'test-exec-hook')
  62. def test_exec_hook_07():
  63. os.chdir('/')
  64. spec = 'flock --nonblock /var/lock/focker.lock -c ls'
  65. focker_lock()
  66. assert fcntl.flock(focker_lock.fd, fcntl.LOCK_EX | fcntl.LOCK_NB) != 0
  67. with TemporaryDirectory() as d:
  68. exec_hook(spec, d, 'test-exec-hook')
  69. assert fcntl.flock(focker_lock.fd, fcntl.LOCK_EX | fcntl.LOCK_NB) != 0
  70. focker_unlock()
  71. def _test_simple_forward(fun, fwd_fun_name='exec_hook'):
  72. src = inspect.getsource(fun)
  73. mod = ast.parse(src)
  74. assert isinstance(mod.body[0], ast.FunctionDef)
  75. assert isinstance(mod.body[0].body[0], ast.Return)
  76. assert isinstance(mod.body[0].body[0].value, ast.Call)
  77. assert mod.body[0].body[0].value.func.id == fwd_fun_name
  78. def test_exec_prebuild():
  79. _test_simple_forward(exec_prebuild)
  80. def test_exec_postbuild():
  81. _test_simple_forward(exec_postbuild)
  82. def test_build_volumes():
  83. subprocess.check_output(['focker', 'volume', 'remove', '--force', 'test-build-volumes'])
  84. err = False
  85. try:
  86. name, _ = zfs_find('test-build-volumes', focker_type='volume')
  87. except:
  88. err = True
  89. assert err
  90. spec = {
  91. 'test-build-volumes': {
  92. 'chown': '65534:65534',
  93. 'chmod': 0o123,
  94. 'zfs': {
  95. 'quota': '1G',
  96. 'readonly': 'on'
  97. }
  98. }
  99. }
  100. build_volumes(spec)
  101. name, _ = zfs_find('test-build-volumes', focker_type='volume')
  102. st = os.stat(zfs_mountpoint(name))
  103. assert st.st_uid == 65534
  104. assert st.st_gid == 65534
  105. assert ('%o' % st.st_mode)[-3:] == '123'
  106. zst = zfs_parse_output(['zfs', 'get', '-H', 'quota,readonly', name])
  107. assert zst[0][2] == '1G'
  108. assert zst[1][2] == 'on'
  109. subprocess.check_output(['zfs', 'destroy', '-r', '-f', name])
  110. def test_build_images():
  111. # focker_unlock()
  112. subprocess.check_output(['focker', 'image', 'remove', '--force', 'test-build-images'])
  113. with TemporaryDirectory() as d:
  114. with open(os.path.join(d, 'Fockerfile'), 'w') as f:
  115. yaml.dump({
  116. 'base': 'freebsd-latest',
  117. 'steps': [
  118. { 'run': 'touch /test-build-images' }
  119. ]
  120. }, f)
  121. args = lambda: 0
  122. args.squeeze = False
  123. build_images({
  124. 'test-build-images': '.'
  125. }, d, args)
  126. focker_unlock()
  127. name, _ = zfs_find('test-build-images', focker_type='image')
  128. assert os.path.exists(os.path.join(zfs_mountpoint(name), 'test-build-images'))
  129. subprocess.check_output(['focker', 'image', 'remove', '--force', 'test-build-images'])