apache/superset · error · ReportScheduleExecutorNotFoundError

Report Schedule executor user %(username)s was not found.

Error message

Report Schedule executor user %(username)s was not found.

What it means

ReportScheduleExecutorNotFoundError: during execution the command resolves which user runs the report via get_executor(ALERT_REPORTS_EXECUTORS, model) and then security_manager.find_user(username). If the resolved username no longer maps to a user (deleted, renamed, or a bad value in the config list), find_user returns None and this dedicated error replaces an opaque NoneType crash.

Source

Thrown at superset/commands/report/execute.py:136

    Resolve the executor user for a report schedule.

    Determines the configured executor username via ``get_executor`` and looks up
    the corresponding user. A deleted/disabled user or a misconfigured
    ``ALERT_REPORTS_EXECUTORS`` makes ``security_manager.find_user`` return
    ``None``; rather than passing ``None`` into the webdriver/auth flow (which
    fails with an opaque NoneType error), raise a dedicated, actionable error.

    :returns: the ``(user, username)`` pair — the username is returned alongside
        the user because several call sites log it after resolution.
    :raises ReportScheduleExecutorNotFoundError: if the executor user is missing.
    """
    _, username = get_executor(
        executors=app.config["ALERT_REPORTS_EXECUTORS"],
        model=model,
    )
    user = security_manager.find_user(username)
    if user is None:
        raise ReportScheduleExecutorNotFoundError(username)
    return user, username


def log_report_delivery_phase(
    report_context: ReportExecutionContext | None,
    recipient_type: ReportRecipientType | None,
    phase: str,
    *,
    enforce_budget: bool,
) -> None:
    """Enforce and log a notification phase when executing a report."""

    if report_context is None:
        return
    deadline = report_context.deadline
    if enforce_budget:
        deadline.timeout_seconds(
            "notification_delivery",

View on GitHub (pinned to f4587218dd)

Solutions

  1. Set ALERT_REPORTS_EXECUTORS in superset_config.py to usernames that exist and will remain (a dedicated service account)
  2. Reassign ownership of affected reports to an active user (PUT owners on /api/v1/report/{id})
  3. Recreate or restore the missing user, then re-run the schedule

Example fix

# before
ALERT_REPORTS_EXECUTORS = ['former_employee']  # user deleted -> executor not found

# after
ALERT_REPORTS_EXECUTORS = ['report_executor_svc']  # durable service account
Defensive patterns

Strategy: validation

Validate before calling

from superset import security_manager, app

for username in app.config['ALERT_REPORTS_EXECUTORS'] or ['ScheduledReports']:
    if security_manager.find_user(username) is None:
        raise ConfigError(f'ALERT_REPORTS_EXECUTORS references unknown user {username!r}')

Type guard

def executor_exists(username: str) -> bool:
    return security_manager.find_user(username) is not None

Try / catch

try:
    user, username = resolve_executor(model)
except ReportScheduleExecutorNotFoundError as ex:
    # reassign report ownership / fix executor config, then re-run
    logger.warning('executor %s missing; skipping run', ex.username)

Prevention

When it happens

Trigger: ALERT_REPORTS_EXECUTORS contains a username of a removed user and the report falls back to it; the report's owner/creator user row was deleted from the ABUser table; user renamed in an external auth store synced back to Superset.

Common situations: Offboarding deletes users who own reports; LDAP/OAuth sync renames accounts; misconfigured ALERT_REPORTS_EXECUTORS listing stale service accounts.

Related errors


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/bd88342ba43d9df0. Report an issue: GitHub.