Работающий импорт с изменением БД

This commit is contained in:
Volobuev Andrey
2025-04-04 09:19:37 +03:00
parent 992073d2f5
commit 6ffc432b42
8 changed files with 491 additions and 266 deletions

View File

@@ -6,22 +6,11 @@ import os
from pathlib import Path
from superset_tool.models import SupersetConfig, DatabaseConfig
from superset_tool.client import SupersetClient
from superset_tool.utils.logger import SupersetLogger
from superset_tool.utils.fileio import save_and_unpack_dashboard, archive_exports, sanitize_filename
# Настройка логирования
LOG_DIR = Path("P:\\Superset\\010 Бекапы\\Logs")
LOG_DIR.mkdir(exist_ok=True, parents=True)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(LOG_DIR / f"superset_backup_{datetime.now().strftime('%Y%m%d')}.log"),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
def setup_clients():
def setup_clients(logger: SupersetLogger):
"""Инициализация клиентов для разных окружений"""
clients = {}
try:
@@ -34,11 +23,12 @@ def setup_clients():
"password": keyring.get_password("system", "dev migrate"),
"refresh": True
},
logger=logger,
verify_ssl=False
)
# Конфигурация для Prod
sandbox_config = SupersetConfig(
prod_config = SupersetConfig(
base_url="https://prodta.bi.dwh.rusal.com/api/v1",
auth={
"provider": "db",
@@ -46,11 +36,12 @@ def setup_clients():
"password": keyring.get_password("system", "prod migrate"),
"refresh": True
},
logger=logger,
verify_ssl=False
)
# Конфигурация для Sandbox
prod_config = SupersetConfig(
sandbox_config = SupersetConfig(
base_url="https://sandboxta.bi.dwh.rusal.com/api/v1",
auth={
"provider": "db",
@@ -58,20 +49,24 @@ def setup_clients():
"password": keyring.get_password("system", "sandbox migrate"),
"refresh": True
},
logger=logger,
verify_ssl=False
)
clients['dev'] = SupersetClient(dev_config)
clients['sbx'] = SupersetClient(sandbox_config)
clients['prod'] = SupersetClient(prod_config)
logger.info("Клиенты для окружений успешно инициализированы")
return clients
except Exception as e:
logger.error(f"Ошибка инициализации клиентов: {str(e)}")
raise
def backup_dashboards(client, env_name, backup_root):
def backup_dashboards(client,
env_name,
backup_root,
logger: SupersetLogger ):
"""Выполнение бэкапа дашбордов для указанного окружения"""
logger.info(f"Начало бэкапа для окружения {env_name}")
try:
dashboard_count, dashboard_meta = client.get_dashboards()
total = 0
@@ -93,48 +88,57 @@ def backup_dashboards(client, env_name, backup_root):
unpack=False
)
logger.info(f"[{env_name}] Дашборд {dashboard_title} сохранен в {zip_path}")
success += 1
#Очистка старых бэкапов
try:
archive_exports(dashboard_dir)
logger.debug(f"[{env_name}] Выполнена очистка для {dashboard_title}")
except Exception as cleanup_error:
logger.error(f"[{env_name}] Ошибка очистки {dashboard_title}: {str(cleanup_error)}")
raise cleanup_error
except Exception as db_error:
logger.error(f"[{env_name}] Ошибка обработки дашборда {dashboard_title}: {str(db_error)}",
exc_info=True)
logger.info(f"Бэкап {env_name} завершен. Успешно: {success}/{total}. Всего на сервере - {dashboard_count}")
raise db_error
return success == total
except Exception as e:
logger.error(f"Критическая ошибка при бэкапе {env_name}: {str(e)}", exc_info=True)
return False
def main():
# Инициализация логгера
log_dir = Path("P:\\Superset\\010 Бекапы\\Logs")
logger = SupersetLogger(
log_dir=log_dir,
level=logging.INFO,
console=True
)
"""Основная функция выполнения бэкапа"""
logger.info("="*50)
logger.info("Запуск процесса бэкапа Superset")
logger.info("="*50)
try:
clients = setup_clients()
clients = setup_clients(logger)
superset_backup_repo = Path("P:\\Superset\\010 Бекапы")
# Бэкап для DEV
dev_success = backup_dashboards(
clients['dev'],
"DEV",
superset_backup_repo
superset_backup_repo,
logger=logger
)
# Бэкап для Sandbox
#Бэкап для Sandbox
sbx_success = backup_dashboards(
clients['sbx'],
"SBX",
superset_backup_repo
superset_backup_repo,
logger=logger
)
#Бэкап для Прода
prod_success = backup_dashboards(
clients['prod'],
"PROD",
superset_backup_repo,
logger=logger
)
# Итоговый отчет
@@ -142,7 +146,8 @@ def main():
logger.info("Итоги выполнения бэкапа:")
logger.info(f"DEV: {'Успешно' if dev_success else 'С ошибками'}")
logger.info(f"SBX: {'Успешно' if sbx_success else 'С ошибками'}")
logger.info(f"Полный лог доступен в: {LOG_DIR}")
logger.info(f"PROD: {'Успешно' if prod_success else 'С ошибками'}")
logger.info(f"Полный лог доступен в: {log_dir}")
except Exception as e:
logger.critical(f"Фатальная ошибка выполнения скрипта: {str(e)}", exc_info=True)