vigie (0.0.3~bpo11+1) UNRELEASED; urgency=medium

  [ Thomas Goirand ]
  * Add project purging as a queued worker task: POST /v2/purge-project
    accepts a batch of projects plus the vigietools purge options,
    creates one PROJECT_PURGE task per project, and casts them to an
    alive worker. The worker runs purges through vigietools with
    progress reporting, and up to [tasks]/project_purge_max_executors
    purges run at the same time, cluster-wide, the additional ones being
    queued in the tasks table.
  * Keep eventlet out of the unit test process: select the threading
    backend of oslo.service when the backend system exists (oslo.service
    >= 4.1.0), so that the tests neither use the eventlet backend
    components nor monkey-patch the standard library. Zed, where
    eventlet remains the only backend, is unaffected; the new regression
    tests skip there.
  * The workers can stop a running task: WorkerManager.stop_task()
    records the stop request fed by the new POST /v2/tasks-abort (next
    commit), the operation reporter unwinds the task with a TaskAborted
    when the stop is requested or its row is gone, and vigietools
    receives an abort_check so that every step, resource and wait
    boundary stops too. The aborted task is marked ERROR with the
    operation 'Aborted task.' under the group decision lock.
  * Every terminal state write of the task methods now goes through
    finish_task(), which re-reads the row and writes DONE/ERROR while
    holding the cluster-wide decision lock of the worker group, failing
    open when the coordination backend is unavailable.
  * POST /v2/tasks-abort asks the workers to stop one or more RUNNING
    tasks: the request is refused unless every task is running (404
    unknown, 409 non-running), the decision lock of each worker group is
    held while the RUNNING state is re-verified and the stop_task casts
    are sent, and the API never touches the rows (the workers mark the
    aborted tasks themselves). A task which finished while waiting for
    the lock, and a failed cast, are reported per task. POST /v2/tasks-
    delete now refuses with a 409, and deletes nothing, when any
    requested task is still running.
  * The workers accept a force_abort_task RPC: asked by a force abort of
    the API, the worker marks the task ERROR with the operation 'Aborted
    task.' even when it holds no thread for it (the worker restarted
    while the task was running). When the task happens to be live after
    all, the stop request is recorded as well, and the task aborts at
    its next boundary. The terminal state write of finish_task() was
    extracted into _write_terminal_state() for the task types without a
    worker group.
  * The rows of a tasks-abort answer now follow the request order: the
    SQL rows came back in no particular order, and the CLI showed the
    abort requests shuffled.
  * POST /v2/tasks-abort accepts a force option: the workers are asked
    to force-abort the tasks, and mark the rows aborted even when they
    hold no thread for them anymore (a worker restarted while its task
    was running). The API still never touches the rows itself.
  * POST /v2/tasks-delete accepts a force option: the rows are deleted
    even when their task is still running. A live worker notices the
    deletion at its next operation report and unwinds cleanly; the force
    abort of tasks-abort remains the way to stop a task promptly.
  * Let the service update endpoint answer 400 instead of 500 on an
    unparseable request body, like every other endpoint.
  * Guard the database rollbacks of the validate-compute, validate-
    cleanup and purge-project handlers, so that a session which never
    opened still serves the generic JSON error instead of crashing with
    an AttributeError.
  * Make the enginefacade sessions transactional on old oslo.db: before
    oslo.db 13 they default to autocommit, on which SQLAlchemy < 1.4
    raises "No transaction is begun" on commit().
  * Poll for the decision locks on tooz < 3, whose acquire() takes no
    timeout argument: the writes silently happened without any lock.
  * Relax the requirements floors to the versions shipped in Debian
    Bullseye, so the Xena backport builds and installs against the
    distro stack.
  * Select the eventlet backend when the oslo.service backend system
    predates the threading one (the Epoxy-era 4.1.x):
    init_backend(THREADING) raised ValueError there, which broke the
    test discovery and the worker startup.
  * Record the request parameters of the validate, clean-up and purge
    tasks with their rows (a new JSON-encoded parameters column, with
    its alembic migration), so that a failed task can be retried with
    the very same options as its original request.
  * Add POST /v2/tasks-retry (policy vigie:tasks_retry): one or more
    ERROR tasks are re-queued, under the decision lock of their worker
    group, on a freshly selected worker, replaying the request
    parameters recorded with the rows. The whole request is refused
    while any task is not in ERROR, or when a row predates the parameter
    recording. A failed cast restores the ERROR state of the row.
  * Record the operations reported by the running tasks in a new
    task_logs table (one row per vigietools callback, with its creation
    time, indexed by the task UUID), and delete them along with their
    task on tasks-delete and tasks-clean.
  * Add GET /v2/task/<task-id>/log (policy vigie:task_log_show): it
    returns the operations which the worker reported for a task while it
    was running, ordered by created_at, then by id.
  * Append the terminal state of a task to its operation log:
    'Finished.' on success, the error message on failure, so that the
    log of a failed task ends with why it failed. The operation column
    of the task rows is also truncated to its 255 characters on write,
    while the log rows keep the full operations.
  * Make the config generator tests survive an installed-only tree: the
    entry points are read from the installed distribution metadata when
    it is available (filtered to the vigie distribution, the
    oslo.config.opts group holds the listers of every oslo library too),
    with the setup.cfg of a source checkout as fallback, and the
    generator conf test skips when the tree does not carry
    etc/vigie/vigie-config-generator.conf.
  * Configure the database facade at the start of the worker's main():
    its first get_session() (the service record of Service.create())
    happened on an unconfigured engine facade, which oslo.db < 13 lazily
    builds from cfg.CONF with autocommit sessions -- the first commit()
    then raised 'No transaction is begun.' on SQLAlchemy < 1.4, crashing
    the worker at startup (the API already does this in
    get_application()).

  [ Jenkins ]
  * Rebuilt by bop.

 -- Jenkins <jenkins@bullseye-zed.infomaniak.ch>  Tue, 13 Oct 2026 19:18:34 +0000

vigie (0.0.2) unstable; urgency=medium

  * Fix Python 3.9 import crash: Optional[cfg.CONF] used the unhashable
    ConfigOpts instance as a type annotation, killing the import of
    vigie.rpc on Bullseye + Zed. Use the cfg.ConfigOpts class instead
    and add a regression test.
  * Run tests at build time.
  * Fix the unit tests on tooz releases where the zake driver was
    removed: use the file driver on a private temporary directory for
    the real-lock tests.
  * Prevent the Zed-era eventlet monkey-patch from wedging the shared
    stestr workers when the test suite runs at build time on Bullseye +
    Zed.

 -- Thomas Goirand <zigo@debian.org>  Tue, 06 Oct 2026 08:11:01 +0200

vigie (0.0.1) unstable; urgency=medium

  * Initial release. (Closes: #1147763)

 -- Thomas Goirand <zigo@debian.org>  Mon, 06 Oct 2025 09:25:01 +0200
