280 lines
9.0 KiB
Python
280 lines
9.0 KiB
Python
"""
|
||
存储管理器初始化模块
|
||
|
||
本模块负责初始化和配置存储管理器,注册所有可用的存储提供者工厂。
|
||
提供统一的存储服务访问入口,简化使用复杂度。
|
||
|
||
使用方式:
|
||
from utils.storage_manager_init import get_storage_manager, get_provider
|
||
|
||
# 获取存储管理器
|
||
manager = get_storage_manager()
|
||
|
||
# 直接获取默认存储提供者
|
||
provider = get_provider()
|
||
|
||
# 获取指定类型的存储提供者
|
||
s3_provider = get_provider("s3", {"access_key_id": "...", "secret_access_key": "..."})
|
||
"""
|
||
|
||
from typing import Any, Dict, Optional
|
||
|
||
import loguru
|
||
|
||
from ..config_utils import config
|
||
from .providers.cos_provider import COSStorageFactory
|
||
from .providers.s3_provider import S3StorageFactory
|
||
from .providers.vod_provider import VODStorageFactory
|
||
from .storage_interface import (
|
||
DownloadResult,
|
||
StorageProvider,
|
||
UploadResult,
|
||
storage_manager,
|
||
)
|
||
|
||
|
||
def initialize_storage_manager():
|
||
"""
|
||
初始化存储管理器,注册所有可用的存储工厂
|
||
|
||
注册的存储类型:
|
||
- S3: AWS S3存储服务
|
||
- COS: 腾讯云COS存储服务
|
||
- VOD: 腾讯云VOD视频点播服务
|
||
"""
|
||
try:
|
||
# 注册S3存储工厂
|
||
s3_factory = S3StorageFactory()
|
||
for storage_type in s3_factory.get_supported_types():
|
||
storage_manager.register_factory(storage_type, s3_factory)
|
||
|
||
# 注册COS存储工厂
|
||
cos_factory = COSStorageFactory()
|
||
for storage_type in cos_factory.get_supported_types():
|
||
storage_manager.register_factory(storage_type, cos_factory)
|
||
|
||
# 注册VOD存储工厂
|
||
vod_factory = VODStorageFactory()
|
||
for storage_type in vod_factory.get_supported_types():
|
||
storage_manager.register_factory(storage_type, vod_factory)
|
||
|
||
loguru.logger.info("存储管理器初始化完成")
|
||
loguru.logger.info(f"支持的存储类型: {storage_manager.get_supported_types()}")
|
||
|
||
except Exception as e:
|
||
loguru.logger.error(f"存储管理器初始化失败: {e}")
|
||
raise
|
||
|
||
|
||
def create_default_providers():
|
||
"""
|
||
创建默认的存储提供者
|
||
|
||
根据配置文件中的可用配置自动创建存储提供者实例。
|
||
优先级: S3 > COS
|
||
"""
|
||
providers_created = []
|
||
|
||
# 尝试创建S3提供者
|
||
if config.has_aws_config():
|
||
try:
|
||
aws_config = config.get_aws_config()
|
||
s3_provider = storage_manager.create_provider(
|
||
"s3", aws_config, "default_s3"
|
||
)
|
||
providers_created.append("S3")
|
||
loguru.logger.info("默认S3存储提供者创建成功")
|
||
except Exception as e:
|
||
loguru.logger.warning(f"S3存储提供者创建失败: {e}")
|
||
|
||
# 尝试创建COS提供者
|
||
if config.has_cos_config():
|
||
try:
|
||
cos_config = config.get_cos_config()
|
||
cos_provider = storage_manager.create_provider(
|
||
"cos", cos_config, "default_cos"
|
||
)
|
||
providers_created.append("COS")
|
||
loguru.logger.info("默认COS存储提供者创建成功")
|
||
except Exception as e:
|
||
loguru.logger.warning(f"COS存储提供者创建失败: {e}")
|
||
|
||
# 尝试创建VOD提供者
|
||
if config.has_vod_config():
|
||
try:
|
||
vod_config = config.get_vod_config()
|
||
vod_provider = storage_manager.create_provider(
|
||
"vod", vod_config, "default_vod"
|
||
)
|
||
providers_created.append("VOD")
|
||
loguru.logger.info("默认VOD存储提供者创建成功")
|
||
except Exception as e:
|
||
loguru.logger.warning(f"VOD存储提供者创建失败: {e}")
|
||
|
||
if providers_created:
|
||
loguru.logger.info(f"默认存储提供者创建完成: {', '.join(providers_created)}")
|
||
else:
|
||
loguru.logger.warning("未能创建任何默认存储提供者,请检查配置文件")
|
||
|
||
|
||
def get_storage_manager():
|
||
"""
|
||
获取已初始化的存储管理器实例
|
||
|
||
Returns:
|
||
StorageManager: 存储管理器实例
|
||
"""
|
||
if not storage_manager.get_supported_types():
|
||
initialize_storage_manager()
|
||
create_default_providers()
|
||
|
||
return storage_manager
|
||
|
||
|
||
def get_provider(
|
||
provider_type: Optional[str] = None, config_dict: Optional[Dict[str, Any]] = None
|
||
) -> StorageProvider:
|
||
"""
|
||
获取存储提供者实例
|
||
|
||
Args:
|
||
provider_type: 存储类型(如:"s3", "cos"),为None时返回默认提供者
|
||
config_dict: 自定义配置字典,为None时使用全局配置
|
||
|
||
Returns:
|
||
StorageProvider: 存储提供者实例
|
||
|
||
Raises:
|
||
ValueError: 当找不到合适的存储提供者时抛出异常
|
||
"""
|
||
manager = get_storage_manager()
|
||
|
||
# 如果没有指定类型,返回默认提供者
|
||
if provider_type is None:
|
||
try:
|
||
return manager.get_provider()
|
||
except ValueError:
|
||
# 如果没有默认提供者,尝试创建一个
|
||
if config.has_aws_config():
|
||
aws_config = config.get_aws_config()
|
||
return manager.create_provider("s3", aws_config)
|
||
elif config.has_cos_config():
|
||
cos_config = config.get_cos_config()
|
||
return manager.create_provider("cos", cos_config)
|
||
elif config.has_vod_config():
|
||
vod_config = config.get_vod_config()
|
||
return manager.create_provider("vod", vod_config)
|
||
else:
|
||
raise ValueError("无法找到有效的存储配置,请检查配置文件")
|
||
|
||
# 创建指定类型的提供者
|
||
if config_dict:
|
||
provider_id = f"{provider_type}_{hash(str(config_dict))}"
|
||
return manager.create_provider(provider_type, config_dict, provider_id)
|
||
else:
|
||
# 尝试从已有提供者中获取
|
||
try:
|
||
return manager.get_provider(f"default_{provider_type}")
|
||
except ValueError:
|
||
# 如果不存在,使用全局配置创建
|
||
if provider_type in ["s3", "aws", "amazon"] and config.has_aws_config():
|
||
aws_config = config.get_aws_config()
|
||
return manager.create_provider(
|
||
"s3", aws_config, f"default_{provider_type}"
|
||
)
|
||
elif (
|
||
provider_type in ["cos", "qcloud", "tencent"]
|
||
and config.has_cos_config()
|
||
):
|
||
cos_config = config.get_cos_config()
|
||
return manager.create_provider(
|
||
"cos", cos_config, f"default_{provider_type}"
|
||
)
|
||
elif (
|
||
provider_type in ["vod", "tencent_vod", "qcloud_vod"]
|
||
and config.has_vod_config()
|
||
):
|
||
vod_config = config.get_vod_config()
|
||
return manager.create_provider(
|
||
"vod", vod_config, f"default_{provider_type}"
|
||
)
|
||
else:
|
||
raise ValueError(
|
||
f"无法为类型 {provider_type} 创建存储提供者,缺少配置信息"
|
||
)
|
||
|
||
|
||
def get_available_storage_types() -> Dict[str, bool]:
|
||
"""
|
||
获取所有可用的存储类型及其可用状态
|
||
|
||
Returns:
|
||
Dict[str, bool]: 存储类型及其可用状态的字典
|
||
"""
|
||
manager = get_storage_manager()
|
||
supported_types = manager.get_supported_types()
|
||
|
||
availability = {}
|
||
for storage_type in supported_types:
|
||
try:
|
||
# 尝试创建提供者来检查可用性
|
||
if storage_type in ["s3", "aws", "amazon"]:
|
||
availability[storage_type] = config.has_aws_config()
|
||
elif storage_type in ["cos", "qcloud", "tencent"]:
|
||
availability[storage_type] = config.has_cos_config()
|
||
elif storage_type in ["vod", "tencent_vod", "qcloud_vod"]:
|
||
availability[storage_type] = config.has_vod_config()
|
||
else:
|
||
availability[storage_type] = False
|
||
except Exception:
|
||
availability[storage_type] = False
|
||
|
||
return availability
|
||
|
||
|
||
def validate_storage_config(storage_type: str, config_dict: Dict[str, Any]) -> bool:
|
||
"""
|
||
验证存储配置的有效性
|
||
|
||
Args:
|
||
storage_type: 存储类型
|
||
config_dict: 配置字典
|
||
|
||
Returns:
|
||
bool: 配置是否有效
|
||
"""
|
||
try:
|
||
manager = get_storage_manager()
|
||
|
||
# 尝试创建提供者以验证配置
|
||
test_provider = manager.create_provider(
|
||
storage_type, config_dict, "test_provider"
|
||
)
|
||
|
||
# 清理测试提供者
|
||
# 注意:这里我们不从manager中移除,因为create_provider会缓存它
|
||
|
||
return True
|
||
except Exception as e:
|
||
loguru.logger.error(f"存储配置验证失败: {e}")
|
||
return False
|
||
|
||
|
||
# 在模块加载时自动初始化
|
||
try:
|
||
initialize_storage_manager()
|
||
create_default_providers()
|
||
except Exception as e:
|
||
loguru.logger.error(f"存储管理器自动初始化失败: {e}")
|
||
|
||
|
||
# 导出主要接口
|
||
__all__ = [
|
||
"get_storage_manager",
|
||
"get_provider",
|
||
"get_available_storage_types",
|
||
"validate_storage_config",
|
||
"UploadResult",
|
||
"DownloadResult",
|
||
]
|