summaryrefslogtreecommitdiff
path: root/src/caas/services/firmwareservice.py
diff options
context:
space:
mode:
authorckonstanski <kostcarl@isu.edu>2026-07-30 18:17:14 -0600
committerckonstanski <kostcarl@isu.edu>2026-07-30 18:17:14 -0600
commit640ff61422bc0ee3966941b93d9889ddbbd38d77 (patch)
treeabf1c08f5d38ee53ec8b29dc4f425722517505e6 /src/caas/services/firmwareservice.py
parent22dae02a86c1fce71091bfa5289cf99abba1b217 (diff)
more filesHEADmaster
Diffstat (limited to 'src/caas/services/firmwareservice.py')
-rw-r--r--src/caas/services/firmwareservice.py87
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