summaryrefslogtreecommitdiff
path: root/src/caas/services/playbookreportservice.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/caas/services/playbookreportservice.py')
-rw-r--r--src/caas/services/playbookreportservice.py147
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}