Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace)
This commit is contained in:
@@ -0,0 +1,82 @@
|
|||||||
|
# Copyright (C) 2025 Cetmix OÜ
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from odoo import fields, models, tools
|
||||||
|
|
||||||
|
from odoo.addons.cetmix_tower_server.models.constants import (
|
||||||
|
COMMAND_STOPPED,
|
||||||
|
COMMAND_TIMED_OUT,
|
||||||
|
)
|
||||||
|
from odoo.addons.queue_job.job import CANCELLED
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class CxTowerCommandLog(models.Model):
|
||||||
|
_inherit = "cx.tower.command.log"
|
||||||
|
|
||||||
|
queue_job_id = fields.Many2one(
|
||||||
|
"queue.job",
|
||||||
|
readonly=True,
|
||||||
|
groups="queue_job.group_queue_job_manager",
|
||||||
|
)
|
||||||
|
|
||||||
|
command_status = fields.Integer(
|
||||||
|
help="0 if command finished successfully.\n"
|
||||||
|
"-100 general error,\n"
|
||||||
|
"-101 not found,\n"
|
||||||
|
"-201 another instance of this command is running,\n"
|
||||||
|
"-202 no runner found for the command action,\n"
|
||||||
|
"-203 Python code execution failed\n"
|
||||||
|
"-205 plan line condition check failed\n"
|
||||||
|
"503 if SSH connection error occurred\n"
|
||||||
|
"601 if queue job failed"
|
||||||
|
)
|
||||||
|
|
||||||
|
def finish(
|
||||||
|
self, finish_date=None, status=None, response=None, error=None, **kwargs
|
||||||
|
):
|
||||||
|
"""Finish the command log
|
||||||
|
|
||||||
|
Args:
|
||||||
|
finish_date (Datetime, optional): Command finish date. Defaults to None.
|
||||||
|
status (Integer, optional): Command status. Defaults to None.
|
||||||
|
response (Text, optional): Command response. Defaults to None.
|
||||||
|
error (Text, optional): Command error. Defaults to None.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Filter out command logs that are already stopped
|
||||||
|
command_logs_to_process = self.filtered(
|
||||||
|
lambda log: log.command_status != COMMAND_STOPPED
|
||||||
|
)
|
||||||
|
if not command_logs_to_process:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Avoid finishing the command log multiple times at the same time
|
||||||
|
try:
|
||||||
|
with self.env.cr.savepoint(), tools.mute_logger("odoo.sql_db"):
|
||||||
|
self.env.cr.execute(
|
||||||
|
f"SELECT command_status FROM {self._table} WHERE id IN %s FOR UPDATE NOWAIT", # noqa: E501
|
||||||
|
(tuple(command_logs_to_process.ids),),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
_logger.error(
|
||||||
|
"Could not acquire lock on command logs %s, skipping finish: %s",
|
||||||
|
command_logs_to_process.ids,
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Update the related queue job state if the command timed out
|
||||||
|
if status == COMMAND_TIMED_OUT:
|
||||||
|
for command_log in command_logs_to_process:
|
||||||
|
if command_log.queue_job_id:
|
||||||
|
command_log.queue_job_id.sudo()._change_job_state(
|
||||||
|
CANCELLED, result=error
|
||||||
|
)
|
||||||
|
|
||||||
|
return super(CxTowerCommandLog, command_logs_to_process).finish(
|
||||||
|
finish_date, status, response, error, **kwargs
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user