metrics_test.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import logging
  2. import os
  3. import socket
  4. from http.server import BaseHTTPRequestHandler
  5. from http.server import HTTPServer
  6. from threading import Thread
  7. import requests
  8. from docker.transport import UnixHTTPAdapter
  9. from tests.acceptance.cli_test import dispatch
  10. from tests.integration.testcases import DockerClientTestCase
  11. TEST_SOCKET_FILE = '/tmp/test-metrics-docker-cli.sock'
  12. class MetricsTest(DockerClientTestCase):
  13. test_session = requests.sessions.Session()
  14. test_env = None
  15. base_dir = 'tests/fixtures/v3-full'
  16. @classmethod
  17. def setUpClass(cls):
  18. super().setUpClass()
  19. MetricsTest.test_session.mount("http+unix://", UnixHTTPAdapter(TEST_SOCKET_FILE))
  20. MetricsTest.test_env = os.environ.copy()
  21. MetricsTest.test_env['METRICS_SOCKET_FILE'] = TEST_SOCKET_FILE
  22. MetricsServer().start()
  23. @classmethod
  24. def test_metrics_help(cls):
  25. # root `docker-compose` command is considered as a `--help`
  26. dispatch(cls.base_dir, [], env=MetricsTest.test_env)
  27. assert cls.get_content() == \
  28. b'{"command": "compose --help", "context": "moby", ' \
  29. b'"source": "docker-compose", "status": "success"}'
  30. dispatch(cls.base_dir, ['help', 'run'], env=MetricsTest.test_env)
  31. assert cls.get_content() == \
  32. b'{"command": "compose help", "context": "moby", ' \
  33. b'"source": "docker-compose", "status": "success"}'
  34. dispatch(cls.base_dir, ['--help'], env=MetricsTest.test_env)
  35. assert cls.get_content() == \
  36. b'{"command": "compose --help", "context": "moby", ' \
  37. b'"source": "docker-compose", "status": "success"}'
  38. dispatch(cls.base_dir, ['run', '--help'], env=MetricsTest.test_env)
  39. assert cls.get_content() == \
  40. b'{"command": "compose --help run", "context": "moby", ' \
  41. b'"source": "docker-compose", "status": "success"}'
  42. dispatch(cls.base_dir, ['up', '--help', 'extra_args'], env=MetricsTest.test_env)
  43. assert cls.get_content() == \
  44. b'{"command": "compose --help up", "context": "moby", ' \
  45. b'"source": "docker-compose", "status": "success"}'
  46. @classmethod
  47. def test_metrics_simple_commands(cls):
  48. dispatch(cls.base_dir, ['ps'], env=MetricsTest.test_env)
  49. assert cls.get_content() == \
  50. b'{"command": "compose ps", "context": "moby", ' \
  51. b'"source": "docker-compose", "status": "success"}'
  52. dispatch(cls.base_dir, ['version'], env=MetricsTest.test_env)
  53. assert cls.get_content() == \
  54. b'{"command": "compose version", "context": "moby", ' \
  55. b'"source": "docker-compose", "status": "success"}'
  56. dispatch(cls.base_dir, ['version', '--yyy'], env=MetricsTest.test_env)
  57. assert cls.get_content() == \
  58. b'{"command": "compose version", "context": "moby", ' \
  59. b'"source": "docker-compose", "status": "failure"}'
  60. @staticmethod
  61. def get_content():
  62. resp = MetricsTest.test_session.get("http+unix://localhost")
  63. print(resp.content)
  64. return resp.content
  65. def start_server(uri=TEST_SOCKET_FILE):
  66. try:
  67. os.remove(uri)
  68. except OSError:
  69. pass
  70. httpd = HTTPServer(uri, MetricsHTTPRequestHandler, False)
  71. sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  72. sock.bind(TEST_SOCKET_FILE)
  73. sock.listen(0)
  74. httpd.socket = sock
  75. print('Serving on ', uri)
  76. httpd.serve_forever()
  77. sock.shutdown(socket.SHUT_RDWR)
  78. sock.close()
  79. os.remove(uri)
  80. class MetricsServer:
  81. @classmethod
  82. def start(cls):
  83. t = Thread(target=start_server, daemon=True)
  84. t.start()
  85. class MetricsHTTPRequestHandler(BaseHTTPRequestHandler):
  86. usages = []
  87. def do_GET(self):
  88. self.client_address = ('',) # avoid exception in BaseHTTPServer.py log_message()
  89. self.send_response(200)
  90. self.end_headers()
  91. for u in MetricsHTTPRequestHandler.usages:
  92. self.wfile.write(u)
  93. MetricsHTTPRequestHandler.usages = []
  94. def do_POST(self):
  95. self.client_address = ('',) # avoid exception in BaseHTTPServer.py log_message()
  96. content_length = int(self.headers['Content-Length'])
  97. body = self.rfile.read(content_length)
  98. print(body)
  99. MetricsHTTPRequestHandler.usages.append(body)
  100. self.send_response(200)
  101. self.end_headers()
  102. if __name__ == '__main__':
  103. logging.getLogger("urllib3").propagate = False
  104. logging.getLogger("requests").propagate = False
  105. start_server()