diff options
Diffstat (limited to 'src/caas/services/playbookreportservice.py')
| -rw-r--r-- | src/caas/services/playbookreportservice.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/caas/services/playbookreportservice.py b/src/caas/services/playbookreportservice.py new file mode 100644 index 0000000..73abdfa --- /dev/null +++ b/src/caas/services/playbookreportservice.py @@ -0,0 +1,147 @@ +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} |
