from __future__ import annotations
import logging
from onegov.pas.app import PasApp
from onegov.pas.importer.orchestrator import KubImporter
from onegov.pas.log import CompositeOutputHandler, LogOutputHandler
from onegov.pas.importer.output_handlers import DatabaseOutputHandler
from typing import Any, TYPE_CHECKING, cast
if TYPE_CHECKING:
from onegov.pas.app import PasApp as PasAppType
from onegov.pas.request import PasRequest
[docs]
log = logging.getLogger('onegov.pas.cronjobs')
@PasApp.cronjob(hour='*', minute=0, timezone='UTC')
[docs]
def hourly_kub_data_import(request: PasRequest) -> None:
try:
trigger_kub_data_import(request, import_type='automatic')
except ValueError as e:
log.warning(f'KUB import skipped: {e}')
except Exception:
log.exception('KUB import failed')
raise
[docs]
def trigger_kub_data_import(
request: PasRequest, import_type: str
) -> dict[str, Any] | None:
app = request.app
# FIXME: this is a bit crude, this will have to be
# a conditional statement in puppet
if not (kub_token := getattr(app, 'kub_test_api_token', None)):
if not (kub_token := getattr(app, 'kub_api_token', None)):
return None
if not (kub_base_url := getattr(app, 'kub_test_base_url', None)):
if not (kub_base_url := getattr(app, 'kub_base_url', None)):
raise ValueError('KUB base URL not configured')
db_handler = DatabaseOutputHandler()
log_handler = LogOutputHandler()
output_handler = CompositeOutputHandler(db_handler, log_handler)
with KubImporter(kub_token, kub_base_url, output_handler) as importer:
combined_results, import_log_id = importer.run_full_sync(
request, cast('PasAppType', app), import_type
)
# Return results for UI display (if applicable)
return {
'import_results': combined_results.get('import', {}),
'custom_results': combined_results.get('custom_data'),
'import_log_id': import_log_id
}