您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

test_celery_ssl.py 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. """Tests for Celery SSL configuration."""
  2. import ssl
  3. from unittest.mock import MagicMock, patch
  4. class TestCelerySSLConfiguration:
  5. """Test suite for Celery SSL configuration."""
  6. def test_get_celery_ssl_options_when_ssl_disabled(self):
  7. """Test SSL options when REDIS_USE_SSL is False."""
  8. mock_config = MagicMock()
  9. mock_config.REDIS_USE_SSL = False
  10. with patch("extensions.ext_celery.dify_config", mock_config):
  11. from extensions.ext_celery import _get_celery_ssl_options
  12. result = _get_celery_ssl_options()
  13. assert result is None
  14. def test_get_celery_ssl_options_when_broker_not_redis(self):
  15. """Test SSL options when broker is not Redis."""
  16. mock_config = MagicMock()
  17. mock_config.REDIS_USE_SSL = True
  18. mock_config.CELERY_BROKER_URL = "amqp://localhost:5672"
  19. with patch("extensions.ext_celery.dify_config", mock_config):
  20. from extensions.ext_celery import _get_celery_ssl_options
  21. result = _get_celery_ssl_options()
  22. assert result is None
  23. def test_get_celery_ssl_options_with_cert_none(self):
  24. """Test SSL options with CERT_NONE requirement."""
  25. mock_config = MagicMock()
  26. mock_config.REDIS_USE_SSL = True
  27. mock_config.CELERY_BROKER_URL = "redis://localhost:6379/0"
  28. mock_config.REDIS_SSL_CERT_REQS = "CERT_NONE"
  29. mock_config.REDIS_SSL_CA_CERTS = None
  30. mock_config.REDIS_SSL_CERTFILE = None
  31. mock_config.REDIS_SSL_KEYFILE = None
  32. with patch("extensions.ext_celery.dify_config", mock_config):
  33. from extensions.ext_celery import _get_celery_ssl_options
  34. result = _get_celery_ssl_options()
  35. assert result is not None
  36. assert result["ssl_cert_reqs"] == ssl.CERT_NONE
  37. assert result["ssl_ca_certs"] is None
  38. assert result["ssl_certfile"] is None
  39. assert result["ssl_keyfile"] is None
  40. def test_get_celery_ssl_options_with_cert_required(self):
  41. """Test SSL options with CERT_REQUIRED and certificates."""
  42. mock_config = MagicMock()
  43. mock_config.REDIS_USE_SSL = True
  44. mock_config.CELERY_BROKER_URL = "rediss://localhost:6380/0"
  45. mock_config.REDIS_SSL_CERT_REQS = "CERT_REQUIRED"
  46. mock_config.REDIS_SSL_CA_CERTS = "/path/to/ca.crt"
  47. mock_config.REDIS_SSL_CERTFILE = "/path/to/client.crt"
  48. mock_config.REDIS_SSL_KEYFILE = "/path/to/client.key"
  49. with patch("extensions.ext_celery.dify_config", mock_config):
  50. from extensions.ext_celery import _get_celery_ssl_options
  51. result = _get_celery_ssl_options()
  52. assert result is not None
  53. assert result["ssl_cert_reqs"] == ssl.CERT_REQUIRED
  54. assert result["ssl_ca_certs"] == "/path/to/ca.crt"
  55. assert result["ssl_certfile"] == "/path/to/client.crt"
  56. assert result["ssl_keyfile"] == "/path/to/client.key"
  57. def test_get_celery_ssl_options_with_cert_optional(self):
  58. """Test SSL options with CERT_OPTIONAL requirement."""
  59. mock_config = MagicMock()
  60. mock_config.REDIS_USE_SSL = True
  61. mock_config.CELERY_BROKER_URL = "redis://localhost:6379/0"
  62. mock_config.REDIS_SSL_CERT_REQS = "CERT_OPTIONAL"
  63. mock_config.REDIS_SSL_CA_CERTS = "/path/to/ca.crt"
  64. mock_config.REDIS_SSL_CERTFILE = None
  65. mock_config.REDIS_SSL_KEYFILE = None
  66. with patch("extensions.ext_celery.dify_config", mock_config):
  67. from extensions.ext_celery import _get_celery_ssl_options
  68. result = _get_celery_ssl_options()
  69. assert result is not None
  70. assert result["ssl_cert_reqs"] == ssl.CERT_OPTIONAL
  71. assert result["ssl_ca_certs"] == "/path/to/ca.crt"
  72. def test_get_celery_ssl_options_with_invalid_cert_reqs(self):
  73. """Test SSL options with invalid cert requirement defaults to CERT_NONE."""
  74. mock_config = MagicMock()
  75. mock_config.REDIS_USE_SSL = True
  76. mock_config.CELERY_BROKER_URL = "redis://localhost:6379/0"
  77. mock_config.REDIS_SSL_CERT_REQS = "INVALID_VALUE"
  78. mock_config.REDIS_SSL_CA_CERTS = None
  79. mock_config.REDIS_SSL_CERTFILE = None
  80. mock_config.REDIS_SSL_KEYFILE = None
  81. with patch("extensions.ext_celery.dify_config", mock_config):
  82. from extensions.ext_celery import _get_celery_ssl_options
  83. result = _get_celery_ssl_options()
  84. assert result is not None
  85. assert result["ssl_cert_reqs"] == ssl.CERT_NONE # Should default to CERT_NONE
  86. def test_celery_init_applies_ssl_to_broker_and_backend(self):
  87. """Test that SSL options are applied to both broker and backend when using Redis."""
  88. mock_config = MagicMock()
  89. mock_config.REDIS_USE_SSL = True
  90. mock_config.CELERY_BROKER_URL = "redis://localhost:6379/0"
  91. mock_config.CELERY_BACKEND = "redis"
  92. mock_config.CELERY_RESULT_BACKEND = "redis://localhost:6379/0"
  93. mock_config.REDIS_SSL_CERT_REQS = "CERT_NONE"
  94. mock_config.REDIS_SSL_CA_CERTS = None
  95. mock_config.REDIS_SSL_CERTFILE = None
  96. mock_config.REDIS_SSL_KEYFILE = None
  97. mock_config.CELERY_USE_SENTINEL = False
  98. mock_config.LOG_FORMAT = "%(message)s"
  99. mock_config.LOG_TZ = "UTC"
  100. mock_config.LOG_FILE = None
  101. # Mock all the scheduler configs
  102. mock_config.CELERY_BEAT_SCHEDULER_TIME = 1
  103. mock_config.ENABLE_CLEAN_EMBEDDING_CACHE_TASK = False
  104. mock_config.ENABLE_CLEAN_UNUSED_DATASETS_TASK = False
  105. mock_config.ENABLE_CREATE_TIDB_SERVERLESS_TASK = False
  106. mock_config.ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK = False
  107. mock_config.ENABLE_CLEAN_MESSAGES = False
  108. mock_config.ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK = False
  109. mock_config.ENABLE_DATASETS_QUEUE_MONITOR = False
  110. mock_config.ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK = False
  111. with patch("extensions.ext_celery.dify_config", mock_config):
  112. from dify_app import DifyApp
  113. from extensions.ext_celery import init_app
  114. app = DifyApp(__name__)
  115. celery_app = init_app(app)
  116. # Check that SSL options were applied
  117. assert "broker_use_ssl" in celery_app.conf
  118. assert celery_app.conf["broker_use_ssl"] is not None
  119. assert celery_app.conf["broker_use_ssl"]["ssl_cert_reqs"] == ssl.CERT_NONE
  120. # Check that SSL is also applied to Redis backend
  121. assert "redis_backend_use_ssl" in celery_app.conf
  122. assert celery_app.conf["redis_backend_use_ssl"] is not None