diff options
| author | ckonstanski <kostcarl@isu.edu> | 2026-07-30 18:17:14 -0600 |
|---|---|---|
| committer | ckonstanski <kostcarl@isu.edu> | 2026-07-30 18:17:14 -0600 |
| commit | 640ff61422bc0ee3966941b93d9889ddbbd38d77 (patch) | |
| tree | abf1c08f5d38ee53ec8b29dc4f425722517505e6 /src/caas/services/firmwareservice.py | |
| parent | 22dae02a86c1fce71091bfa5289cf99abba1b217 (diff) | |
Diffstat (limited to 'src/caas/services/firmwareservice.py')
| -rw-r--r-- | src/caas/services/firmwareservice.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/caas/services/firmwareservice.py b/src/caas/services/firmwareservice.py new file mode 100644 index 0000000..97bfecc --- /dev/null +++ b/src/caas/services/firmwareservice.py @@ -0,0 +1,87 @@ +import datetime +from .helpers import Jinja +from .ansibleservice import AnsibleService +from ..models import FirmwareUpgradeSchedule, FirmwareBatch +from django.conf import settings +import logging + + +logger = logging.getLogger("caas") + + +""" +Expected versions. The bottom one is OK; the top one is too old. +firmware-version: 6.00 0x800036cb 1.1747.0 +firmware-version: 7.20 0x80007fdf 1.2585.0 +""" +class FirmwareService(AnsibleService): + """ + target == ilo_host_address + """ + def __init__(self, target, git, branch, playbook, zmq): + super().__init__("nic", target, git, branch, playbook, zmq) + + def schedule_upgrade(self): + logger.debug("%s Enter schedule_upgrade" % self.target) + try: + firmwarebatch_kwargs = {"ilo_host_address": self.target} + firmwarebatch = FirmwareBatch.objects.get(**firmwarebatch_kwargs) + except FirmwareBatch.DoesNotExist: + errmsg = "%s FAILED: while checking Intel NIC firmware version: cannot find server" % self.target + logger.error(errmsg) + return -1 + if firmwarebatch.intel_nic_firmware_version != settings.INTEL_NIC_FIRMWARE_VERSION: + firmware_kwargs = {"server_id": firmwarebatch.pk} + firmware, firmware_created = FirmwareUpgradeSchedule.objects.get_or_create(**firmware_kwargs) + if firmware.date_scheduled == None: + firmware.date_scheduled = datetime.datetime.now() + if firmware.kirke_ticket_number == None: + # TODO bealer: create KIRKE ticket + pass + firmware.save() + return 0 + + def deploy(self): + logger.debug("%s Enter deploy" % self.target) + kirke_inprocess_kwargs = {"kirke_ticket_number__isnull": False, + "kirke_ticket_completed__isnull": True} + kirke_inprocess = FirmwareUpgradeSchedule.objects.filter(**kirke_inprocess_kwargs) + for rec in kirke_inprocess: + # TODO bealer: query KIRKE and update status + rec.save() + firmware_schedule_kwargs = {"kirke_ticket_completed__isnull": False, + "date_completed__isnull": True} + firmware_schedule_ready = FirmwareUpgradeSchedule.objects.filter(**firmware_schedule_kwargs) + for sched in firmware_schedule_ready: + try: + firmwarebatch_kwargs = {"pk": sched.server.pk} + firmwarebatch = FirmwareBatch.objects.get(**firmwarebatch_kwargs) + except FirmwareBatch.DoesNotExist: + errmsg = "%s FAILED: while running firmware batch playbook: failed to look up batch" % self.target + logger.error(errmsg) + return -1 + self.target = firmwarebatch.ilo_hostname + # host_vars file + hostvars_config = {"ilo_host_address": firmwarebatch.ilo_host_address, + "wr_bmc_username": firmwarebatch.bmc_username, + "wr_bmc_password": firmwarebatch.bmc_password, + "wr_webdav_firmwarebatch": settings.WR_WEBDAV_SERVER, + "wr_webdav_server": settings.WR_WEBDAV_SERVER, + "wr_webdav_username": settings.WR_WEBDAV_USERNAME, + "wr_webdav_password": settings.WR_WEBDAV_PASSWORD, + "middleware_endpoint": settings.CAAS_MIDDLEWARE_ENDPOINT, + "middleware_username": settings.CAAS_MIDDLEWARE_USERNAME, + "middleware_password": settings.CAAS_MIDDLEWARE_PASSWORD, + "wr_registry_server": settings.WR_REGISTRY_SERVER, + "firmware_iso": settings.FIRMWARE_ISO} + hostvars_content = Jinja.render("firmware_host_vars.j2", **hostvars_config) + hostvars = self.target + # inventory file + inventory_config = {"target": firmwarebatch.ilo_hostname, + "ilo_host_address": firmwarebatch.ilo_host_address} + inventory_content = Jinja.render("firmware_inventory.j2", **inventory_config) + inventory = "%s.yaml" % self.target + logger.debug("%s Sending playbook to queue" % self.target) + self.run_playbook(inventory, inventory_content, hostvars, hostvars_content, extra_args = {"autoremediate": firmwarebatch.ilo_host_address}) + logger.debug("%s Sent playbook to queue" % self.target) + return 0 |
