summaryrefslogtreecommitdiff
path: root/src/caas/services/firmwareservice.py
blob: 97bfecc21a64202f54f64073c6351f4dc53deaaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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