import logging from odoo import api, fields, models try: import requests except ImportError: requests = None _logger = logging.getLogger(__name__) HTTP_CHECK_TIMEOUT = 10 # seconds class ServiceInstance(models.Model): _inherit = "service.instance" last_http_status_code = fields.Integer( string="Last HTTP Status Code", readonly=True, default=0, ) last_http_check_date = fields.Datetime( string="Last HTTP Check Date", readonly=True, ) http_status_ok = fields.Boolean( string="HTTP Status OK", readonly=True, default=True, ) def check_http_status(self): for rec in self: if not rec.service_url or not rec.equipment_id: continue equipment = rec.equipment_id if getattr(equipment, "maintenance_mode", False): continue status_ok = False status_code = -1 now = fields.Datetime.now() url = rec.service_url if not url.lower().startswith("https://"): url = "https://" + url.removeprefix("http://").removeprefix("HTTP://") try: response = requests.get(url, timeout=HTTP_CHECK_TIMEOUT) status_code = response.status_code status_ok = status_code == 200 except requests.exceptions.RequestException as e: _logger.warning("HTTP check failed for %s: %s", rec.service_url, e) rec.write( { "last_http_status_code": status_code, "last_http_check_date": now, "http_status_ok": status_ok, } ) if not status_ok: # Delegate maintenance.request creation to equipment if hasattr(equipment, "create_http_maintenance_request"): equipment.create_http_maintenance_request([rec]) @api.model def cron_check_http_services(self): domain = [ ("active", "=", True), ("service_url", "!=", False), ("equipment_id", "!=", False), ] services = self.search(domain) for service in services: equipment = service.equipment_id if getattr(equipment, "maintenance_mode", False): continue service.check_http_status()