mcp-proxy-adapter 2.0.1__py3-none-any.whl โ 6.9.50__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mcp-proxy-adapter might be problematic. Click here for more details.
- mcp_proxy_adapter/__init__.py +47 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +0 -0
- mcp_proxy_adapter/api/app.py +66 -0
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +400 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_context.py +356 -0
- mcp_proxy_adapter/api/core/registration_manager.py +307 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +181 -0
- mcp_proxy_adapter/api/middleware/__init__.py +21 -0
- mcp_proxy_adapter/api/middleware/base.py +54 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
- mcp_proxy_adapter/api/middleware/factory.py +147 -0
- mcp_proxy_adapter/api/middleware/logging.py +31 -0
- mcp_proxy_adapter/api/middleware/performance.py +51 -0
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
- mcp_proxy_adapter/api/openapi/__init__.py +21 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
- mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
- mcp_proxy_adapter/api/schemas.py +270 -0
- mcp_proxy_adapter/api/tool_integration.py +131 -0
- mcp_proxy_adapter/api/tools.py +163 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +15 -0
- mcp_proxy_adapter/cli/commands/client.py +100 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
- mcp_proxy_adapter/cli/commands/generate.py +259 -0
- mcp_proxy_adapter/cli/commands/server.py +174 -0
- mcp_proxy_adapter/cli/commands/sets.py +132 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
- mcp_proxy_adapter/cli/examples/__init__.py +8 -0
- mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
- mcp_proxy_adapter/cli/examples/https_token.py +96 -0
- mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
- mcp_proxy_adapter/cli/main.py +63 -0
- mcp_proxy_adapter/cli/parser.py +338 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
- mcp_proxy_adapter/client/proxy.py +123 -0
- mcp_proxy_adapter/commands/__init__.py +66 -0
- mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
- mcp_proxy_adapter/commands/base.py +389 -0
- mcp_proxy_adapter/commands/builtin_commands.py +30 -0
- mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
- mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
- mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
- mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
- mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
- mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
- mcp_proxy_adapter/commands/catalog_manager.py +97 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
- mcp_proxy_adapter/commands/command_registry.py +298 -0
- mcp_proxy_adapter/commands/config_command.py +102 -0
- mcp_proxy_adapter/commands/dependency_container.py +40 -0
- mcp_proxy_adapter/commands/dependency_manager.py +143 -0
- mcp_proxy_adapter/commands/echo_command.py +48 -0
- mcp_proxy_adapter/commands/health_command.py +142 -0
- mcp_proxy_adapter/commands/help_command.py +175 -0
- mcp_proxy_adapter/commands/hooks.py +172 -0
- mcp_proxy_adapter/commands/key_management_command.py +484 -0
- mcp_proxy_adapter/commands/load_command.py +123 -0
- mcp_proxy_adapter/commands/plugins_command.py +246 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +76 -0
- mcp_proxy_adapter/commands/registry/__init__.py +18 -0
- mcp_proxy_adapter/commands/registry/command_info.py +103 -0
- mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
- mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
- mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
- mcp_proxy_adapter/commands/reload_command.py +136 -0
- mcp_proxy_adapter/commands/result.py +157 -0
- mcp_proxy_adapter/commands/role_test_command.py +99 -0
- mcp_proxy_adapter/commands/roles_management_command.py +502 -0
- mcp_proxy_adapter/commands/security_command.py +472 -0
- mcp_proxy_adapter/commands/settings_command.py +113 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
- mcp_proxy_adapter/commands/token_management_command.py +500 -0
- mcp_proxy_adapter/commands/transport_management_command.py +129 -0
- mcp_proxy_adapter/commands/unload_command.py +92 -0
- mcp_proxy_adapter/config.py +32 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory.py +560 -0
- mcp_proxy_adapter/core/app_runner.py +318 -0
- mcp_proxy_adapter/core/auth_validator.py +508 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
- mcp_proxy_adapter/core/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/client.py +608 -0
- mcp_proxy_adapter/core/client_manager.py +271 -0
- mcp_proxy_adapter/core/client_security.py +411 -0
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +237 -0
- mcp_proxy_adapter/core/config/config_factory.py +22 -0
- mcp_proxy_adapter/core/config/config_loader.py +66 -0
- mcp_proxy_adapter/core/config/feature_manager.py +31 -0
- mcp_proxy_adapter/core/config/simple_config.py +204 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
- mcp_proxy_adapter/core/config_converter.py +252 -0
- mcp_proxy_adapter/core/config_validator.py +211 -0
- mcp_proxy_adapter/core/crl_utils.py +362 -0
- mcp_proxy_adapter/core/errors.py +276 -0
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +250 -0
- mcp_proxy_adapter/core/mtls_asgi.py +140 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/mtls_proxy.py +229 -0
- mcp_proxy_adapter/core/mtls_server.py +154 -0
- mcp_proxy_adapter/core/protocol_manager.py +232 -0
- mcp_proxy_adapter/core/proxy/__init__.py +19 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +184 -0
- mcp_proxy_adapter/core/proxy_registration.py +80 -0
- mcp_proxy_adapter/core/role_utils.py +103 -0
- mcp_proxy_adapter/core/security_adapter.py +343 -0
- mcp_proxy_adapter/core/security_factory.py +96 -0
- mcp_proxy_adapter/core/security_integration.py +342 -0
- mcp_proxy_adapter/core/server_adapter.py +251 -0
- mcp_proxy_adapter/core/server_engine.py +217 -0
- mcp_proxy_adapter/core/settings.py +260 -0
- mcp_proxy_adapter/core/signal_handler.py +107 -0
- mcp_proxy_adapter/core/ssl_utils.py +161 -0
- mcp_proxy_adapter/core/transport_manager.py +153 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
- mcp_proxy_adapter/core/utils.py +101 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +219 -0
- mcp_proxy_adapter/core/validation/file_validator.py +131 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
- mcp_proxy_adapter/core/validation/security_validator.py +140 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +58 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
- mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
- mcp_proxy_adapter/examples/check_config.py +413 -0
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/config_builder.py +234 -0
- mcp_proxy_adapter/examples/config_cli.py +282 -0
- mcp_proxy_adapter/examples/create_test_configs.py +174 -0
- mcp_proxy_adapter/examples/debug_request_state.py +130 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
- mcp_proxy_adapter/examples/demo_client.py +287 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
- mcp_proxy_adapter/examples/full_application/main.py +311 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
- mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
- mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
- mcp_proxy_adapter/examples/generate_config.py +502 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
- mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
- mcp_proxy_adapter/examples/queue_server_example.py +85 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
- mcp_proxy_adapter/examples/required_certificates.py +208 -0
- mcp_proxy_adapter/examples/run_example.py +77 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
- mcp_proxy_adapter/examples/security_test_client.py +72 -0
- mcp_proxy_adapter/examples/setup/__init__.py +24 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
- mcp_proxy_adapter/examples/test_config.py +205 -0
- mcp_proxy_adapter/examples/test_config_builder.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +308 -0
- mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
- mcp_proxy_adapter/examples/universal_client.py +674 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +311 -0
- mcp_proxy_adapter/openapi.py +375 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/version.py +5 -0
- mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
- mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
- {mcp_proxy_adapter-2.0.1.dist-info โ mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
- mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
- adapters/__init__.py +0 -16
- analyzers/__init__.py +0 -14
- analyzers/docstring_analyzer.py +0 -199
- analyzers/type_analyzer.py +0 -151
- cli/__init__.py +0 -12
- cli/__main__.py +0 -79
- cli/command_runner.py +0 -233
- dispatchers/__init__.py +0 -14
- dispatchers/base_dispatcher.py +0 -85
- dispatchers/json_rpc_dispatcher.py +0 -198
- generators/__init__.py +0 -14
- generators/endpoint_generator.py +0 -172
- generators/openapi_generator.py +0 -254
- generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
- mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
- mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
- mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
- openapi_schema/__init__.py +0 -38
- openapi_schema/command_registry.py +0 -312
- openapi_schema/rest_schema.py +0 -510
- openapi_schema/rpc_generator.py +0 -307
- openapi_schema/rpc_schema.py +0 -416
- validators/__init__.py +0 -14
- validators/base_validator.py +0 -23
- validators/docstring_validator.py +0 -75
- validators/metadata_validator.py +0 -76
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Update Configuration Files with Correct Certificate Paths
|
|
4
|
+
This script updates all configuration files to use the correct certificate paths.
|
|
5
|
+
|
|
6
|
+
Author: Vasiliy Zdanovskiy
|
|
7
|
+
email: vasilyvz@gmail.com
|
|
8
|
+
"""
|
|
9
|
+
import json
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Dict, Any
|
|
12
|
+
|
|
13
|
+
from required_certificates import CONFIG_CERTIFICATE_MAPPINGS
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ConfigUpdater:
|
|
17
|
+
"""Updates configuration files with correct certificate paths."""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
"""Initialize the config updater."""
|
|
21
|
+
self.working_dir = Path.cwd()
|
|
22
|
+
self.configs_dir = self.working_dir / "configs"
|
|
23
|
+
|
|
24
|
+
def print_step(self, step: str, description: str):
|
|
25
|
+
"""Print a formatted step header."""
|
|
26
|
+
print(f"\n{'=' * 60}")
|
|
27
|
+
print(f"๐ง STEP {step}: {description}")
|
|
28
|
+
print(f"{'=' * 60}")
|
|
29
|
+
|
|
30
|
+
def print_success(self, message: str):
|
|
31
|
+
"""Print a success message."""
|
|
32
|
+
print(f"โ
{message}")
|
|
33
|
+
|
|
34
|
+
def print_error(self, message: str):
|
|
35
|
+
"""Print an error message."""
|
|
36
|
+
print(f"โ {message}")
|
|
37
|
+
|
|
38
|
+
def print_info(self, message: str):
|
|
39
|
+
"""Print an info message."""
|
|
40
|
+
print(f"โน๏ธ {message}")
|
|
41
|
+
|
|
42
|
+
def update_config_file(self, config_file: str, certificate_mappings: Dict[str, str]) -> bool:
|
|
43
|
+
"""Update a single configuration file with correct certificate paths."""
|
|
44
|
+
config_path = self.configs_dir / config_file
|
|
45
|
+
|
|
46
|
+
if not config_path.exists():
|
|
47
|
+
self.print_error(f"Configuration file not found: {config_file}")
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
# Load configuration
|
|
52
|
+
with open(config_path, 'r') as f:
|
|
53
|
+
config = json.load(f)
|
|
54
|
+
|
|
55
|
+
# Update certificate paths
|
|
56
|
+
updated = False
|
|
57
|
+
for path, new_value in certificate_mappings.items():
|
|
58
|
+
if self.update_nested_path(config, path, new_value):
|
|
59
|
+
updated = True
|
|
60
|
+
|
|
61
|
+
if updated:
|
|
62
|
+
# Save updated configuration
|
|
63
|
+
with open(config_path, 'w') as f:
|
|
64
|
+
json.dump(config, f, indent=2)
|
|
65
|
+
self.print_success(f"Updated {config_file}")
|
|
66
|
+
return True
|
|
67
|
+
else:
|
|
68
|
+
self.print_info(f"No updates needed for {config_file}")
|
|
69
|
+
return True
|
|
70
|
+
|
|
71
|
+
except Exception as e:
|
|
72
|
+
self.print_error(f"Failed to update {config_file}: {e}")
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
def update_nested_path(self, config: Dict[str, Any], path: str, value: str) -> bool:
|
|
76
|
+
"""Update a nested path in configuration dictionary."""
|
|
77
|
+
keys = path.split('.')
|
|
78
|
+
current = config
|
|
79
|
+
|
|
80
|
+
# Navigate to the parent of the target key
|
|
81
|
+
for key in keys[:-1]:
|
|
82
|
+
if key not in current:
|
|
83
|
+
return False
|
|
84
|
+
current = current[key]
|
|
85
|
+
|
|
86
|
+
# Update the target key
|
|
87
|
+
target_key = keys[-1]
|
|
88
|
+
if target_key in current and current[target_key] != value:
|
|
89
|
+
current[target_key] = value
|
|
90
|
+
return True
|
|
91
|
+
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
def update_all_configs(self) -> bool:
|
|
95
|
+
"""Update all configuration files with correct certificate paths."""
|
|
96
|
+
self.print_step("1", "Updating Configuration Files")
|
|
97
|
+
|
|
98
|
+
success_count = 0
|
|
99
|
+
total_count = len(CONFIG_CERTIFICATE_MAPPINGS)
|
|
100
|
+
|
|
101
|
+
for config_file, certificate_mappings in CONFIG_CERTIFICATE_MAPPINGS.items():
|
|
102
|
+
self.print_info(f"Updating {config_file}...")
|
|
103
|
+
if self.update_config_file(config_file, certificate_mappings):
|
|
104
|
+
success_count += 1
|
|
105
|
+
|
|
106
|
+
# Print summary
|
|
107
|
+
self.print_step("2", "Update Summary")
|
|
108
|
+
print(f"๐ Configuration Update Results:")
|
|
109
|
+
print(f" Total configurations: {total_count}")
|
|
110
|
+
print(f" Successfully updated: {success_count}")
|
|
111
|
+
print(f" Failed: {total_count - success_count}")
|
|
112
|
+
print(f" Success rate: {(success_count/total_count)*100:.1f}%")
|
|
113
|
+
|
|
114
|
+
return success_count == total_count
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def main():
|
|
118
|
+
"""Main entry point."""
|
|
119
|
+
updater = ConfigUpdater()
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
success = updater.update_all_configs()
|
|
123
|
+
if success:
|
|
124
|
+
print(f"\n๐ All configuration files updated successfully!")
|
|
125
|
+
else:
|
|
126
|
+
print(f"\nโ Some configuration files failed to update")
|
|
127
|
+
return success
|
|
128
|
+
except Exception as e:
|
|
129
|
+
print(f"โ Fatal error: {e}")
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
if __name__ == "__main__":
|
|
134
|
+
success = main()
|
|
135
|
+
exit(0 if success else 1)
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Script to validate compatibility between config generator and validator.
|
|
4
|
+
|
|
5
|
+
Author: Vasiliy Zdanovskiy
|
|
6
|
+
email: vasilyvz@gmail.com
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import sys
|
|
11
|
+
import tempfile
|
|
12
|
+
import shutil
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
# Add the project root to the path
|
|
16
|
+
project_root = Path(__file__).parent.parent.parent
|
|
17
|
+
sys.path.insert(0, str(project_root))
|
|
18
|
+
|
|
19
|
+
from mcp_proxy_adapter.core.config_validator import ConfigValidator
|
|
20
|
+
from mcp_proxy_adapter.examples.config_builder import generate_complete_config
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_generator_validator_compatibility():
|
|
24
|
+
"""Test that generated configs pass validation."""
|
|
25
|
+
print("๐ Testing Generator-Validator Compatibility")
|
|
26
|
+
print("=" * 50)
|
|
27
|
+
|
|
28
|
+
# Test configurations to generate
|
|
29
|
+
test_configs = [
|
|
30
|
+
{
|
|
31
|
+
"name": "HTTP Basic",
|
|
32
|
+
"protocol": "http",
|
|
33
|
+
"ssl_enabled": False,
|
|
34
|
+
"security_enabled": False,
|
|
35
|
+
"roles_enabled": False,
|
|
36
|
+
"proxy_registration_enabled": False
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "HTTP + Token",
|
|
40
|
+
"protocol": "http",
|
|
41
|
+
"ssl_enabled": False,
|
|
42
|
+
"security_enabled": True,
|
|
43
|
+
"roles_enabled": False,
|
|
44
|
+
"proxy_registration_enabled": False
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"name": "HTTP + Token + Roles",
|
|
48
|
+
"protocol": "http",
|
|
49
|
+
"ssl_enabled": False,
|
|
50
|
+
"security_enabled": True,
|
|
51
|
+
"roles_enabled": True,
|
|
52
|
+
"proxy_registration_enabled": False
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "HTTPS Basic",
|
|
56
|
+
"protocol": "https",
|
|
57
|
+
"ssl_enabled": True,
|
|
58
|
+
"security_enabled": False,
|
|
59
|
+
"roles_enabled": False,
|
|
60
|
+
"proxy_registration_enabled": False
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "HTTPS + Token",
|
|
64
|
+
"protocol": "https",
|
|
65
|
+
"ssl_enabled": True,
|
|
66
|
+
"security_enabled": True,
|
|
67
|
+
"roles_enabled": False,
|
|
68
|
+
"proxy_registration_enabled": False
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "HTTPS + Token + Roles",
|
|
72
|
+
"protocol": "https",
|
|
73
|
+
"ssl_enabled": True,
|
|
74
|
+
"security_enabled": True,
|
|
75
|
+
"roles_enabled": True,
|
|
76
|
+
"proxy_registration_enabled": False
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"name": "mTLS + Proxy Registration",
|
|
80
|
+
"protocol": "mtls",
|
|
81
|
+
"ssl_enabled": True,
|
|
82
|
+
"security_enabled": False,
|
|
83
|
+
"roles_enabled": False,
|
|
84
|
+
"proxy_registration_enabled": True
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
results = []
|
|
89
|
+
|
|
90
|
+
for test_config in test_configs:
|
|
91
|
+
print(f"\n๐ Testing: {test_config['name']}")
|
|
92
|
+
print("-" * 30)
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
# Generate configuration
|
|
96
|
+
print(" ๐ง Generating configuration...")
|
|
97
|
+
generated_config = generate_complete_config(
|
|
98
|
+
host="localhost",
|
|
99
|
+
port=8080
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Create temporary test files
|
|
103
|
+
temp_dir = Path(tempfile.mkdtemp())
|
|
104
|
+
test_files = {}
|
|
105
|
+
|
|
106
|
+
# Modify config based on test parameters
|
|
107
|
+
if test_config["protocol"] != "http":
|
|
108
|
+
generated_config["server"]["protocol"] = test_config["protocol"]
|
|
109
|
+
|
|
110
|
+
if test_config["ssl_enabled"]:
|
|
111
|
+
generated_config["ssl"]["enabled"] = True
|
|
112
|
+
# Create test SSL certificates
|
|
113
|
+
cert_file = temp_dir / "test_cert.crt"
|
|
114
|
+
key_file = temp_dir / "test_key.key"
|
|
115
|
+
ca_cert = temp_dir / "test_ca.crt"
|
|
116
|
+
|
|
117
|
+
# Create dummy certificate files
|
|
118
|
+
cert_file.write_text("-----BEGIN CERTIFICATE-----\nDUMMY CERT\n-----END CERTIFICATE-----")
|
|
119
|
+
key_file.write_text("-----BEGIN PRIVATE KEY-----\nDUMMY KEY\n-----END PRIVATE KEY-----")
|
|
120
|
+
ca_cert.write_text("-----BEGIN CERTIFICATE-----\nDUMMY CA\n-----END CERTIFICATE-----")
|
|
121
|
+
|
|
122
|
+
generated_config["ssl"]["cert_file"] = str(cert_file)
|
|
123
|
+
generated_config["ssl"]["key_file"] = str(key_file)
|
|
124
|
+
generated_config["ssl"]["ca_cert"] = str(ca_cert)
|
|
125
|
+
|
|
126
|
+
test_files["ssl"] = [cert_file, key_file, ca_cert]
|
|
127
|
+
|
|
128
|
+
if test_config["security_enabled"]:
|
|
129
|
+
generated_config["security"]["enabled"] = True
|
|
130
|
+
generated_config["security"]["tokens"] = {
|
|
131
|
+
"test_token": {"permissions": ["*"]}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if test_config["roles_enabled"]:
|
|
135
|
+
generated_config["roles"]["enabled"] = True
|
|
136
|
+
roles_file = temp_dir / "test_roles.json"
|
|
137
|
+
roles_file.write_text('{"admin": ["*"], "user": ["read"]}')
|
|
138
|
+
generated_config["roles"]["config_file"] = str(roles_file)
|
|
139
|
+
test_files["roles"] = [roles_file]
|
|
140
|
+
|
|
141
|
+
if test_config["proxy_registration_enabled"]:
|
|
142
|
+
generated_config["proxy_registration"]["enabled"] = True
|
|
143
|
+
generated_config["proxy_registration"]["proxy_url"] = "http://localhost:3005"
|
|
144
|
+
|
|
145
|
+
# Create test client certificates
|
|
146
|
+
client_cert = temp_dir / "test_client.crt"
|
|
147
|
+
client_key = temp_dir / "test_client.key"
|
|
148
|
+
client_cert.write_text("-----BEGIN CERTIFICATE-----\nDUMMY CLIENT CERT\n-----END CERTIFICATE-----")
|
|
149
|
+
client_key.write_text("-----BEGIN PRIVATE KEY-----\nDUMMY CLIENT KEY\n-----END PRIVATE KEY-----")
|
|
150
|
+
|
|
151
|
+
generated_config["proxy_registration"]["certificate"] = {
|
|
152
|
+
"cert_file": str(client_cert),
|
|
153
|
+
"key_file": str(client_key)
|
|
154
|
+
}
|
|
155
|
+
generated_config["proxy_registration"]["ssl"] = {
|
|
156
|
+
"ca_cert": str(ca_cert) if test_config["ssl_enabled"] else str(temp_dir / "test_ca.crt")
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if "proxy" not in test_files:
|
|
160
|
+
test_files["proxy"] = []
|
|
161
|
+
test_files["proxy"].extend([client_cert, client_key])
|
|
162
|
+
|
|
163
|
+
# Validate configuration
|
|
164
|
+
print(" โ
Validating configuration...")
|
|
165
|
+
validator = ConfigValidator()
|
|
166
|
+
validator.config_data = generated_config
|
|
167
|
+
validation_results = validator.validate_config()
|
|
168
|
+
|
|
169
|
+
# Analyze results
|
|
170
|
+
errors = [r for r in validation_results if r.level == "error"]
|
|
171
|
+
warnings = [r for r in validation_results if r.level == "warning"]
|
|
172
|
+
info = [r for r in validation_results if r.level == "info"]
|
|
173
|
+
|
|
174
|
+
result = {
|
|
175
|
+
"name": test_config["name"],
|
|
176
|
+
"success": len(errors) == 0,
|
|
177
|
+
"errors": len(errors),
|
|
178
|
+
"warnings": len(warnings),
|
|
179
|
+
"info": len(info),
|
|
180
|
+
"error_details": errors,
|
|
181
|
+
"warning_details": warnings
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
results.append(result)
|
|
185
|
+
|
|
186
|
+
# Clean up temporary files
|
|
187
|
+
try:
|
|
188
|
+
shutil.rmtree(temp_dir)
|
|
189
|
+
except Exception as e:
|
|
190
|
+
print(f" โ ๏ธ Warning: Could not clean up temp files: {e}")
|
|
191
|
+
|
|
192
|
+
# Print results
|
|
193
|
+
if result["success"]:
|
|
194
|
+
print(f" โ
PASS - {len(warnings)} warnings, {len(info)} info")
|
|
195
|
+
else:
|
|
196
|
+
print(f" โ FAIL - {len(errors)} errors, {len(warnings)} warnings")
|
|
197
|
+
for error in errors[:3]: # Show first 3 errors
|
|
198
|
+
print(f" โข {error.message}")
|
|
199
|
+
if len(errors) > 3:
|
|
200
|
+
print(f" ... and {len(errors) - 3} more errors")
|
|
201
|
+
|
|
202
|
+
except Exception as e:
|
|
203
|
+
print(f" ๐ฅ EXCEPTION: {str(e)}")
|
|
204
|
+
results.append({
|
|
205
|
+
"name": test_config["name"],
|
|
206
|
+
"success": False,
|
|
207
|
+
"errors": 1,
|
|
208
|
+
"warnings": 0,
|
|
209
|
+
"info": 0,
|
|
210
|
+
"error_details": [f"Exception: {str(e)}"],
|
|
211
|
+
"warning_details": []
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
# Summary
|
|
215
|
+
print("\n" + "=" * 50)
|
|
216
|
+
print("๐ COMPATIBILITY SUMMARY")
|
|
217
|
+
print("=" * 50)
|
|
218
|
+
|
|
219
|
+
total_tests = len(results)
|
|
220
|
+
passed_tests = sum(1 for r in results if r["success"])
|
|
221
|
+
failed_tests = total_tests - passed_tests
|
|
222
|
+
|
|
223
|
+
print(f"Total tests: {total_tests}")
|
|
224
|
+
print(f"Passed: {passed_tests}")
|
|
225
|
+
print(f"Failed: {failed_tests}")
|
|
226
|
+
print(f"Success rate: {(passed_tests/total_tests)*100:.1f}%")
|
|
227
|
+
|
|
228
|
+
if failed_tests > 0:
|
|
229
|
+
print("\nโ FAILED TESTS:")
|
|
230
|
+
for result in results:
|
|
231
|
+
if not result["success"]:
|
|
232
|
+
print(f" โข {result['name']}: {result['errors']} errors")
|
|
233
|
+
for error in result["error_details"][:2]:
|
|
234
|
+
print(f" - {error}")
|
|
235
|
+
|
|
236
|
+
return results
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def test_validation_coverage():
|
|
240
|
+
"""Test that validator covers all generator features."""
|
|
241
|
+
print("\n๐ Testing Validation Coverage")
|
|
242
|
+
print("=" * 50)
|
|
243
|
+
|
|
244
|
+
# Test that validator checks all required sections
|
|
245
|
+
required_sections = [
|
|
246
|
+
"server", "logging", "commands", "debug"
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
optional_sections = [
|
|
250
|
+
"ssl", "security", "roles", "proxy_registration", "transport"
|
|
251
|
+
]
|
|
252
|
+
|
|
253
|
+
print("๐ Required sections validation:")
|
|
254
|
+
for section in required_sections:
|
|
255
|
+
print(f" โ
{section}")
|
|
256
|
+
|
|
257
|
+
print("\n๐ Optional sections validation:")
|
|
258
|
+
for section in optional_sections:
|
|
259
|
+
print(f" โ
{section}")
|
|
260
|
+
|
|
261
|
+
return True
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def test_edge_cases():
|
|
265
|
+
"""Test edge cases and error conditions."""
|
|
266
|
+
print("\n๐ Testing Edge Cases")
|
|
267
|
+
print("=" * 50)
|
|
268
|
+
|
|
269
|
+
edge_cases = [
|
|
270
|
+
{
|
|
271
|
+
"name": "Empty config",
|
|
272
|
+
"config": {},
|
|
273
|
+
"should_fail": True
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"name": "Missing server section",
|
|
277
|
+
"config": {"logging": {"level": "INFO"}},
|
|
278
|
+
"should_fail": True
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"name": "Invalid protocol",
|
|
282
|
+
"config": {
|
|
283
|
+
"server": {"protocol": "invalid", "host": "localhost", "port": 8080},
|
|
284
|
+
"logging": {"level": "INFO"},
|
|
285
|
+
"commands": {"enabled": True},
|
|
286
|
+
"debug": {"enabled": False}
|
|
287
|
+
},
|
|
288
|
+
"should_fail": True
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"name": "SSL enabled without certificates",
|
|
292
|
+
"config": {
|
|
293
|
+
"server": {"protocol": "https", "host": "localhost", "port": 8080},
|
|
294
|
+
"ssl": {"enabled": True},
|
|
295
|
+
"logging": {"level": "INFO"},
|
|
296
|
+
"commands": {"enabled": True},
|
|
297
|
+
"debug": {"enabled": False}
|
|
298
|
+
},
|
|
299
|
+
"should_fail": True
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
|
|
303
|
+
results = []
|
|
304
|
+
|
|
305
|
+
for case in edge_cases:
|
|
306
|
+
print(f"\n๐งช Testing: {case['name']}")
|
|
307
|
+
|
|
308
|
+
try:
|
|
309
|
+
validator = ConfigValidator()
|
|
310
|
+
validator.config_data = case["config"]
|
|
311
|
+
validation_results = validator.validate_config()
|
|
312
|
+
|
|
313
|
+
errors = [r for r in validation_results if r.level == "error"]
|
|
314
|
+
has_errors = len(errors) > 0
|
|
315
|
+
|
|
316
|
+
expected_failure = case["should_fail"]
|
|
317
|
+
test_passed = (has_errors == expected_failure)
|
|
318
|
+
|
|
319
|
+
if test_passed:
|
|
320
|
+
print(f" โ
PASS - {'Correctly failed' if has_errors else 'Correctly passed'}")
|
|
321
|
+
else:
|
|
322
|
+
print(f" โ FAIL - Expected {'failure' if expected_failure else 'success'}, got {'failure' if has_errors else 'success'}")
|
|
323
|
+
|
|
324
|
+
results.append({
|
|
325
|
+
"name": case["name"],
|
|
326
|
+
"passed": test_passed,
|
|
327
|
+
"errors": len(errors)
|
|
328
|
+
})
|
|
329
|
+
|
|
330
|
+
except Exception as e:
|
|
331
|
+
print(f" ๐ฅ EXCEPTION: {str(e)}")
|
|
332
|
+
results.append({
|
|
333
|
+
"name": case["name"],
|
|
334
|
+
"passed": False,
|
|
335
|
+
"errors": 1
|
|
336
|
+
})
|
|
337
|
+
|
|
338
|
+
return results
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def main():
|
|
342
|
+
"""Main test function."""
|
|
343
|
+
print("๐ Generator-Validator Compatibility Test")
|
|
344
|
+
print("=" * 60)
|
|
345
|
+
|
|
346
|
+
try:
|
|
347
|
+
# Test 1: Generator-Validator compatibility
|
|
348
|
+
compatibility_results = test_generator_validator_compatibility()
|
|
349
|
+
|
|
350
|
+
# Test 2: Validation coverage
|
|
351
|
+
test_validation_coverage()
|
|
352
|
+
|
|
353
|
+
# Test 3: Edge cases
|
|
354
|
+
edge_case_results = test_edge_cases()
|
|
355
|
+
|
|
356
|
+
# Final summary
|
|
357
|
+
print("\n" + "=" * 60)
|
|
358
|
+
print("๐ฏ FINAL RESULTS")
|
|
359
|
+
print("=" * 60)
|
|
360
|
+
|
|
361
|
+
compatibility_passed = sum(1 for r in compatibility_results if r["success"])
|
|
362
|
+
edge_cases_passed = sum(1 for r in edge_case_results if r["passed"])
|
|
363
|
+
|
|
364
|
+
print(f"Compatibility tests: {compatibility_passed}/{len(compatibility_results)} passed")
|
|
365
|
+
print(f"Edge case tests: {edge_cases_passed}/{len(edge_case_results)} passed")
|
|
366
|
+
|
|
367
|
+
total_passed = compatibility_passed + edge_cases_passed
|
|
368
|
+
total_tests = len(compatibility_results) + len(edge_case_results)
|
|
369
|
+
|
|
370
|
+
print(f"Overall: {total_passed}/{total_tests} tests passed")
|
|
371
|
+
|
|
372
|
+
if total_passed == total_tests:
|
|
373
|
+
print("๐ ALL TESTS PASSED! Generator and validator are compatible.")
|
|
374
|
+
return 0
|
|
375
|
+
else:
|
|
376
|
+
print("โ Some tests failed. Check the output above for details.")
|
|
377
|
+
return 1
|
|
378
|
+
|
|
379
|
+
except Exception as e:
|
|
380
|
+
print(f"๐ฅ Test suite failed with exception: {str(e)}")
|
|
381
|
+
return 1
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
if __name__ == "__main__":
|
|
385
|
+
sys.exit(main())
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple compatibility test between config generator and validator.
|
|
4
|
+
Tests only the structure and required fields, not file existence or certificate validity.
|
|
5
|
+
|
|
6
|
+
Author: Vasiliy Zdanovskiy
|
|
7
|
+
email: vasilyvz@gmail.com
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Add the project root to the path
|
|
15
|
+
project_root = Path(__file__).parent.parent.parent
|
|
16
|
+
sys.path.insert(0, str(project_root))
|
|
17
|
+
|
|
18
|
+
from mcp_proxy_adapter.core.config_validator import ConfigValidator
|
|
19
|
+
from mcp_proxy_adapter.examples.config_builder import generate_complete_config
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
results = []
|
|
28
|
+
|
|
29
|
+
for test_name, test_func in tests:
|
|
30
|
+
print(f"\n๐งช Running: {test_name}")
|
|
31
|
+
try:
|
|
32
|
+
result = test_func()
|
|
33
|
+
results.append((test_name, result))
|
|
34
|
+
except Exception as e:
|
|
35
|
+
print(f" ๐ฅ Test failed with exception: {str(e)}")
|
|
36
|
+
results.append((test_name, False))
|
|
37
|
+
|
|
38
|
+
# Summary
|
|
39
|
+
print("\n" + "=" * 70)
|
|
40
|
+
print("๐ฏ FINAL RESULTS")
|
|
41
|
+
print("=" * 70)
|
|
42
|
+
|
|
43
|
+
passed = sum(1 for _, result in results if result)
|
|
44
|
+
total = len(results)
|
|
45
|
+
|
|
46
|
+
print(f"Tests passed: {passed}/{total}")
|
|
47
|
+
|
|
48
|
+
for test_name, result in results:
|
|
49
|
+
status = "โ
PASS" if result else "โ FAIL"
|
|
50
|
+
print(f" {status} - {test_name}")
|
|
51
|
+
|
|
52
|
+
if passed == total:
|
|
53
|
+
print("\n๐ ALL TESTS PASSED! Generator and validator are structurally compatible.")
|
|
54
|
+
return 0
|
|
55
|
+
else:
|
|
56
|
+
print(f"\nโ {total - passed} tests failed. Check the output above for details.")
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
if __name__ == "__main__":
|
|
61
|
+
sys.exit(main())
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Integration modules for mcp_proxy_adapter.
|
|
3
|
+
|
|
4
|
+
This package contains integrations with external systems and libraries
|
|
5
|
+
to extend the functionality of the MCP Proxy Adapter framework.
|
|
6
|
+
|
|
7
|
+
Author: Vasiliy Zdanovskiy
|
|
8
|
+
email: vasilyvz@gmail.com
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from .queuemgr_integration import (
|
|
12
|
+
QueueManagerIntegration,
|
|
13
|
+
QueueJobBase,
|
|
14
|
+
QueueJobResult,
|
|
15
|
+
QueueJobStatus,
|
|
16
|
+
QueueJobError,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"QueueManagerIntegration",
|
|
21
|
+
"QueueJobBase",
|
|
22
|
+
"QueueJobResult",
|
|
23
|
+
"QueueJobStatus",
|
|
24
|
+
"QueueJobError",
|
|
25
|
+
]
|