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