import datetime from django.conf import settings from ..models import FirmwareUpgradeSchedule, WrInstallSchedule, Location, Cluster, Server, IcingaBmc, WrBatch from .wrinstallnowservice import WrInstallNowService from .icingapollservice import IcingaPollService from .bmcservice import BmcService from .httpclient import HttpClient import logging logger = logging.getLogger("caas") class PlaybookReportService(): def __init__(self, git, playbook, target, failed): self.git = git self.playbook = playbook self.target = target self.failed = failed def process(self): if ".yaml" in self.playbook: ansible_config = {k: v for (k, v) in settings.ANSIBLE.items() if self.playbook in v.values() and v["git"] == self.git} else: ansible_config = {k: v for (k, v) in settings.ANSIBLE.items() if k == self.playbook and v["git"] == self.git} key = [k for k in ansible_config.keys()][0] if key == "wr": self.target = self.target.split(".yaml")[0] try: cluster_kwargs = {"cluster_name": self.target} cluster = Cluster.objects.get(**cluster_kwargs) except Server.DoesNotExist: return "FAILED: while performing Wind River playbook callback: cannot find cluster with cluster_name: %s" % self.target try: wr_kwargs = {"cluster_id": cluster.pk} wr = WrInstallSchedule.objects.get(**wr_kwargs) except WrInstallSchedule.DoesNotExist: return "FAILED: while performing Wind River playbook callback: cannot find WrInstallSchedule associated with the cluster with cluster_name: %s" % cluster.cluster_name completed = datetime.datetime.utcnow() if wr.kirke_ticket_completed is None: wr.kirke_ticket_completed = completed if self.failed == "0": wr.date_completed = completed wr.kirke_ticket_number = None # Still needs manual check/remediation # # Change default BMC password # server_kwargs = {"cluster_id": cluster.pk} # servers = Server.objects.filter(**server_kwargs) # for server in servers: # bmc = BmcService(server.ilo_host_address, # settings.ANSIBLE["bmc"]["git"], # settings.ANSIBLE["bmc"]["branch"], # settings.ANSIBLE["bmc"]["playbook_adminpassword"], # settings.ANSIBLE["bmc"]["zmq"]) # bmc.deploy() # Orchstration callback try: location_kwargs = {"pk": cluster.location_id} location = Location.objects.get(**location_kwargs) except Location.DoesNotExist: return "FAILED: while performing Wind River playbook callback: cannot find Location associated with the cluster with cluster_name: %s" % cluster.cluster_name payload = {"cluster_status": [{ "name": cluster.cluster_name, "description": location.fuze_spm_site_name, "location": location.fuze_spm_site_id, "software_version": settings.WR_VERSION, "availability": "ONLINE", "deploy_status": "COMPLETE", "created_at": completed.strftime("%Y-%m-%d %H:%M:%S"), "updated_at": completed.strftime("%Y-%m-%d %H:%M:%S")}]} httpclient = HttpClient() resp = httpclient.post(url = "%s/orchestration/caas-status" % settings.CAAS_MIDDLEWARE_ENDPOINT, username = settings.CAAS_MIDDLEWARE_USERNAME, password = settings.CAAS_MIDDLEWARE_PASSWORD, data = payload) if resp.status_code >= 300: return "Error calling orchestration endpoint. Status code: %s , message: %s" % (resp.status_code, resp.text) else: wr.date_completed = None wr.kirke_ticket_number = None wr.date_last_failed = completed wr.save() elif key == "nic": self.target = self.target.split(".yaml")[0] try: icingabmc_kwargs = {"ilo_hostname": self.target} icingabmc = IcingaBmc.objects.get(**icingabmc_kwargs) except IcingaBmc.DoesNotExist: logger.error("FAILED: while deploying Wind River installation: cannot find IcingaBmc with identifier: %s" % self.target) raise try: nic_kwargs = {"server_id": icingabmc.pk} nic = FirmwareUpgradeSchedule.objects.get(**nic_kwargs) except FirmwareUpgradeSchedule.DoesNotExist: logger.error("FAILED: while deploying Wind River installation: cannot find FirmwareUpgradeSchedule with ID: %s" % icingabmc.pk) raise completed = datetime.datetime.utcnow() if nic.kirke_ticket_completed is None: nic.kirke_ticket_completed = completed if self.failed == "0": try: wrbatch_kwargs = {"ilo_host_address": icingabmc.ilo_host_address} wrbatch = WrBatch.objects.get(**wrbatch_kwargs) except WrBatch.DoesNotExist: logger.error("FAILED: while scheduling Wind River installation: cannot find wrbatch with identifier: %s" % icingabmc.ilo_host_address) raise # never run an installation on top of a finished subcloud try: wr_kwargs = {"cluster_id": wrbatch.cluster_id} wr = WrInstallSchedule.objects.get(**wr_kwargs) except WrInstallSchedule.DoesNotExist: return "FAILED: while performing Wind River playbook callback: cannot find WrInstallSchedule associated with the cluster with cluster_name: %s" % cluster.cluster_name if wr.kirke_ticket_number is None: nic.date_completed = completed nic.kirke_ticket_number = nic.pk wrinstallnow = WrInstallNowService("wr", wrbatch.ilo_host_address, settings.ANSIBLE["wr"]["git"], settings.ANSIBLE["wr"]["branch"], settings.ANSIBLE["wr"]["playbook"], settings.ANSIBLE["wr"]["zmq"]) wrinstallnow.deploy() else: nic.date_completed = None nic.kirke_ticket_number = None nic.date_last_failed = completed nic.save() elif key == "bmc": self.target = self.target.split(".yaml")[0] if self.failed == "0": try: icingabmc_kwargs = {"ilo_hostname": self.target} icingabmc = IcingaBmc.objects.get(**icingabmc_kwargs) except IcingaBmc.DoesNotExist: logger.error("FAILED: while deploying Wind River installation: cannot find IcingaBmc with identifier: %s" % self.target) raise icinga_poll = IcingaPollService(icingabmc.ilo_host_address, settings.ANSIBLE["icinga_poll"]["git"], settings.ANSIBLE["icinga_poll"]["branch"], settings.ANSIBLE["icinga_poll"]["playbook"], settings.ANSIBLE["icinga_poll"]["zmq"], "adminpassword") rc = icinga_poll.deploy() return {"git": self.git, "playbook": self.playbook, "target": self.target, "failed": self.failed, "key": key}