From 640ff61422bc0ee3966941b93d9889ddbbd38d77 Mon Sep 17 00:00:00 2001 From: ckonstanski Date: Thu, 30 Jul 2026 18:17:14 -0600 Subject: more files --- src/caas/views.py | 713 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 712 insertions(+), 1 deletion(-) (limited to 'src/caas/views.py') diff --git a/src/caas/views.py b/src/caas/views.py index 91ea44a..049d9e4 100644 --- a/src/caas/views.py +++ b/src/caas/views.py @@ -1,3 +1,714 @@ from django.shortcuts import render +from django.conf import settings +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse +from django.views.decorators.csrf import csrf_exempt +from .forms import CiqUploadForm, CiqUpload2Form, CiqAssignOrphanSubcloudsForm, \ + PasswordUploadForm, SerialNumberForm, DnsForm, \ + MacAddressForm, AdminPasswordForm, NicFirmwareVersionForm, PushButtonForm, \ + PlaybookReportForm, \ + NicFirmwareUpgradeForm, NicFirmwareUpgradeNowForm, \ + WrInstallForm, WrInstallNowForm, \ + AutoremediateForm, WrRemediateForm, \ + WrRebootForm, MockWrRebootForm, SubcloudForm + # QueueCustomForm, \ +from .services.ciqservice import CiqService +from .services.passwordservice import PasswordService +from .services.icingaservice import IcingaService +from .services.bmcservice import BmcService +from .services.macaddressservice import MacAddressService +from .services.dnsservice import DnsService +from .services.firmwareservice import FirmwareService +from .services.wrservice import WrService +from .services.patchservice import PatchService +from .services.playbookreportservice import PlaybookReportService +from .services.icingapollservice import IcingaPollService +from .services.nicfirmwareversionservice import NicFirmwareVersionService +from .services.nicfirmwareupgradenowservice import NicFirmwareUpgradeNowService +from .services.wrinstallnowservice import WrInstallNowService +from .services.subcloudservice import SubcloudService +import logging -# Create your views here. + +logger = logging.getLogger("caas") + + +def index(request): + return HttpResponse("Hello world") + + +def count(request, count): + data = { + "name": "Vitor", + "location": "Finland", + "is_active": True, + "count": count + } + return JsonResponse(data) + + +@csrf_exempt +def passwords(request): + if request.method == "POST": + form = PasswordUploadForm(request.POST, request.FILES) + if form.is_valid(): + PasswordService.import_password_data(request.FILES["filehandle"]) + return HttpResponseRedirect("success/") + else: + form = PasswordUploadForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "passwords.xml", context) + + +def passwords_success(request): + return render(request, "passwords_success.xml") + + +@csrf_exempt +def ciq(request): + if request.method == "POST": + form = CiqUploadForm(request.POST, request.FILES) + if form.is_valid(): + CiqService.import_ciq_data(request.FILES["filehandle"], form.cleaned_data["assign_parent"]) + # TODO: opstracker for lat, long, etc + icinga = IcingaService(settings.ANSIBLE["icinga"]["target"], + settings.ANSIBLE["icinga"]["git"], + settings.ANSIBLE["icinga"]["branch"], + settings.ANSIBLE["icinga"]["playbook"], + settings.ANSIBLE["icinga"]["zmq"]) + icinga.deploy() + return HttpResponseRedirect("success/") + else: + form = CiqUploadForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "ciq.xml", context) + + +@csrf_exempt +def mockciq(request): + if request.method == "POST": + form = PushButtonForm(request.POST) + if form.is_valid(): + icinga = IcingaService(settings.ANSIBLE["icinga"]["target"], + settings.ANSIBLE["icinga"]["git"], + settings.ANSIBLE["icinga"]["branch"], + settings.ANSIBLE["icinga"]["playbook"], + settings.ANSIBLE["icinga"]["zmq"]) + icinga.deploy(mockciq = settings.MOCKCIQ) + return JsonResponse({"status": "OK"}) + else: + form = PushButtonForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "pushbutton.xml", context) + + +def ciq_success(request): + return render(request, "ciq_success.xml") + + +@csrf_exempt +def serialnumber(request): + if request.method == "POST": + logger.debug("POST received") + form = SerialNumberForm(request.POST) + if form.is_valid(): + logger.debug("%s POST received" % form.cleaned_data["ilo_host_address"]) + if not PasswordService.is_server_linked_to_blade(ilo_host_address = form.cleaned_data["ilo_host_address"]): + if not settings.MOCKCIQ: + link_status = PasswordService.link_server_to_blade(vendor_name = form.cleaned_data["vendor"], + serial_number = form.cleaned_data["serial_number"], + ilo_host_address = form.cleaned_data["ilo_host_address"]) + if link_status is None: + logger.error("%s Error linking server to blade!" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "Error linking server to blade!"}) + + PasswordService.create_bmc_admin_password(serial_number = form.cleaned_data["serial_number"]) + dns = DnsService(form.cleaned_data["ilo_host_address"], + settings.ANSIBLE["dns"]["git"], + settings.ANSIBLE["dns"]["branch"], + settings.ANSIBLE["dns"]["playbook"], + settings.ANSIBLE["dns"]["zmq"]) + rc = dns.deploy() + if rc != 0: + errmsg = "%s dns deploy failed" % form.cleaned_data["ilo_host_address"] + logger.error(errmsg) + return JsonResponse({"status": errmsg}) + + # don't run bmc automation against central controllers + if not PasswordService.central_server_p(form.cleaned_data["ilo_host_address"]): + if settings.ENABLE_BMC: + bmc = BmcService(form.cleaned_data["ilo_host_address"], + settings.ANSIBLE["bmc"]["git"], + settings.ANSIBLE["bmc"]["branch"], + settings.ANSIBLE["bmc"]["playbook"], + settings.ANSIBLE["bmc"]["zmq"]) + rc = bmc.deploy() + if rc != 0: + logger.error("%s bmc deploy failed" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "%s bmc deploy failed!" % form.cleaned_data["ilo_host_address"]}) + else: + icingapoll = IcingaPollService(form.cleaned_data["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 = icingapoll.deploy() + if rc != 0: + logger.error("%s icingapoll deploy failed" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "%s icingapoll deploy failed!" % form.cleaned_data["ilo_host_address"]}) + else: + logger.debug("%s server already linked to blade" % form.cleaned_data["ilo_host_address"]) + + return JsonResponse({"status": "OK"}) + else: + errmsg = "%s Error linking server to blade: invalid form" % form.cleaned_data["ilo_host_address"] + logger.error(errmsg) + raise Exception(errmsg) + else: + form = SerialNumberForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "serialnumber.xml", context) + + +@csrf_exempt +def autoremediate(request): + if request.method == "POST": + form = AutoremediateForm(request.POST) + if form.is_valid(): + ilo_host_address_list = form.cleaned_data["ilo_host_address_list"] + for ilo_host_address in list(ilo_host_address_list.split()): + linking_data = PasswordService.get_server_link_data(ilo_host_address) + if linking_data is None: + logger.error("Error PasswordService.get_server_link_data! ilo_host_address=%s" % ilo_host_address) + continue + + PasswordService.create_bmc_admin_password(serial_number = linking_data["serial_number"]) + dns = DnsService(linking_data["ilo_host_address"], + settings.ANSIBLE["dns"]["git"], + settings.ANSIBLE["dns"]["branch"], + settings.ANSIBLE["dns"]["playbook"], + settings.ANSIBLE["dns"]["zmq"]) + rc = dns.deploy() + if rc != 0: + errmsg = "%s dns deploy failed" % form.cleaned_data["ilo_host_address"] + logger.error(errmsg) + return JsonResponse({"status": errmsg}) + + # don't run bmc automation against central controllers + if not PasswordService.central_server_p(ilo_host_address): + if settings.ENABLE_BMC: + bmc = BmcService(linking_data["ilo_host_address"], + settings.ANSIBLE["bmc"]["git"], + settings.ANSIBLE["bmc"]["branch"], + settings.ANSIBLE["bmc"]["playbook"], + settings.ANSIBLE["bmc"]["zmq"]) + rc = bmc.deploy() + if rc != 0: + logger.error("%s bmc deploy failed" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "%s bmc deploy failed!" % form.cleaned_data["ilo_host_address"]}) + else: + icingapoll = IcingaPollService(linking_data["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 = icingapoll.deploy() + if rc != 0: + logger.error("%s dicingapollns deploy failed" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "%s icingapoll deploy failed!" % form.cleaned_data["ilo_host_address"]}) + + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error linking server to blade: invalid form") + else: + form = AutoremediateForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "autoremediate.xml", context) + + +@csrf_exempt +def dns(request): + if request.method == "POST": + form = DnsForm(request.POST) + if form.is_valid(): + dns = DnsService(form.cleaned_data["ilo_host_address"], + settings.ANSIBLE["dns"]["git"], + settings.ANSIBLE["dns"]["branch"], + settings.ANSIBLE["dns"]["playbook"], + settings.ANSIBLE["dns"]["zmq"]) + rc = dns.deploy() + if rc != 0: + errmsg = "%s dns deploy failed" % form.cleaned_data["ilo_host_address"] + logger.error(errmsg) + return JsonResponse({"status": errmsg}) + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing DNS: form input is invalid.") + else: + form = DnsForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "dns.xml", context) + + +# @csrf_exempt +# def queuecustom(request): +# if request.method == "POST": +# form = QueueCustomForm(request.POST) +# if form.is_valid(): +# key = form.cleaned_data["key"] +# playbook_key = form.cleaned_data["playbook_key"] +# ansible = AnsibleService(key, +# form.cleaned_data["target"], +# settings.ANSIBLE[key]["git"], +# settings.ANSIBLE[key]["branch"], +# settings.ANSIBLE[key][playbook_key], +# settings.ANSIBLE[key]["zmq"]) +# if len(form.cleaned_data["cluster_name"]) > 0: +# extra_args = {"cluster-name": form.cleaned_data["cluster_name"]} +# else: +# extra_args = {} +# ansible.run_playbook(extra_args = extra_args) +# return JsonResponse({"status": "OK"}) +# else: +# raise Exception("Error processing queuecustom: form input is invalid.") +# else: +# form = QueueCustomForm() +# context = { +# "title": "Far-Edge Ops Middleware", +# "form": form +# } +# return render(request, "queuecustom.xml", context) + + +@csrf_exempt +def macaddress(request): + if request.method == "POST": + form = MacAddressForm(request.POST) + if form.is_valid(): + MacAddressService.set_server_mac_address(ilo_host_address = form.cleaned_data["ilo_host_address"], + pxe_mac_address = form.cleaned_data["pxe_mac_address"], + intel_nic_firmware_version = form.cleaned_data["intel_nic_firmware_version"]) + + icinga = IcingaService(settings.ANSIBLE["icinga"]["target"], + settings.ANSIBLE["icinga"]["git"], + settings.ANSIBLE["icinga"]["branch"], + settings.ANSIBLE["icinga"]["playbook"], + settings.ANSIBLE["icinga"]["zmq"]) + rc = icinga.deploy() + if rc != 0: + logger.error("%s icinga deploy failed" % form.cleaned_data["ilo_host_address"]) + return JsonResponse({"status": "%s icinga deploy failed!" % form.cleaned_data["ilo_host_address"]}) + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing macaddress: form input is invalid.") + else: + form = MacAddressForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "macaddress.xml", context) + + +@csrf_exempt +def adminpassword(request): + if request.method == "POST": + form = AdminPasswordForm(request.POST) + if form.is_valid(): + ilo_host_address = form.cleaned_data["ilo_host_address"] + icinga_poll_status = form.cleaned_data["icinga_poll_status"] + if icinga_poll_status == "OK": + firmware = FirmwareService(ilo_host_address, + settings.ANSIBLE["nic"]["git"], + settings.ANSIBLE["nic"]["branch"], + settings.ANSIBLE["nic"]["playbook"], + settings.ANSIBLE["nic"]["zmq"]) + firmware.schedule_upgrade() + nicfirmwareupgradenow = NicFirmwareUpgradeNowService(ilo_host_address, + settings.ANSIBLE["nic"]["git"], + settings.ANSIBLE["nic"]["branch"], + settings.ANSIBLE["nic"]["playbook"], + settings.ANSIBLE["nic"]["zmq"]) + nicfirmwareupgradenow.deploy() + wr = WrService(ilo_host_address, + settings.ANSIBLE["wr"]["git"], + settings.ANSIBLE["wr"]["branch"], + settings.ANSIBLE["wr"]["playbook"], + settings.ANSIBLE["wr"]["zmq"]) + wr.schedule_install() + # The firmware pipeline will launch the wr install + return JsonResponse({"status": "OK"}) + else: + return JsonResponse({"status": "NO-OP: icinga_poll status NOT_OK"}) + else: + raise Exception("Error changing BMC administrator password: form is invalid") + else: + form = AdminPasswordForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "adminpassword.xml", context) + + +@csrf_exempt +def nicfirmwareversion(request): + if request.method == "POST": + form = NicFirmwareVersionForm(request.POST) + if form.is_valid(): + NicFirmwareVersionService.set_server_nic_firmware_version(ilo_host_address = form.cleaned_data["ilo_host_address"], + intel_nic_firmware_version = form.cleaned_data["nic_firmware_version"]) + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing macaddress: form input is invalid.") + else: + form = NicFirmwareVersionForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "nicfirmwareversion.xml", context) + + +@csrf_exempt +def nicfirmwareupgrade(request): + if request.method == "POST": + form = NicFirmwareUpgradeForm(request.POST) + if form.is_valid(): + ilo_host_address_list = form.cleaned_data["ilo_host_address_list"] + for ilo_host_address in list(ilo_host_address_list.split()): + icingapoll = IcingaPollService(ilo_host_address, + settings.ANSIBLE["icinga_poll"]["git"], + settings.ANSIBLE["icinga_poll"]["branch"], + settings.ANSIBLE["icinga_poll"]["playbook"], + settings.ANSIBLE["icinga_poll"]["zmq"], + "nicfirmwareupgradenow") + icingapoll.deploy() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing nicfirmwareupgrade: form input is invalid.") + else: + form = NicFirmwareUpgradeForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "nicfirmwareupgrade.xml", context) + + +@csrf_exempt +def nicfirmwareupgradenow(request): + if request.method == "POST": + form = NicFirmwareUpgradeNowForm(request.POST) + if form.is_valid(): + ilo_host_address = form.cleaned_data["ilo_host_address"] + icinga_poll_status = form.cleaned_data["icinga_poll_status"] + if icinga_poll_status == "OK": + firmware = FirmwareService(ilo_host_address, + settings.ANSIBLE["nic"]["git"], + settings.ANSIBLE["nic"]["branch"], + settings.ANSIBLE["nic"]["playbook"], + settings.ANSIBLE["nic"]["zmq"]) + firmware.schedule_upgrade() + + wr = WrService(ilo_host_address, + settings.ANSIBLE["wr"]["git"], + settings.ANSIBLE["wr"]["branch"], + settings.ANSIBLE["wr"]["playbook"], + settings.ANSIBLE["wr"]["zmq"]) + wr.schedule_install() + + nicfirmwareupgradenow = NicFirmwareUpgradeNowService(ilo_host_address, + settings.ANSIBLE["nic"]["git"], + settings.ANSIBLE["nic"]["branch"], + settings.ANSIBLE["nic"]["playbook"], + settings.ANSIBLE["nic"]["zmq"]) + nicfirmwareupgradenow.deploy() + return JsonResponse({"status": "OK"}) + else: + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing nicfirmwareupgradenow: form input is invalid.") + else: + form = NicFirmwareUpgradeNowForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "nicfirmwareupgradenow.xml", context) + +@csrf_exempt +def wrinstall(request): + if request.method == "POST": + form = WrInstallForm(request.POST) + if form.is_valid(): + ilo_host_address_list = form.cleaned_data["ilo_host_address_list"] + for ilo_host_address in list(ilo_host_address_list.split()): + icingapoll = IcingaPollService(ilo_host_address, + settings.ANSIBLE["icinga_poll"]["git"], + settings.ANSIBLE["icinga_poll"]["branch"], + settings.ANSIBLE["icinga_poll"]["playbook"], + settings.ANSIBLE["icinga_poll"]["zmq"], + "wrinstallnow") + icingapoll.deploy() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing wrinstall: form input is invalid.") + else: + form = WrInstallForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "wrinstall.xml", context) + +@csrf_exempt +def wrinstallnow(request): + if request.method == "POST": + form = WrInstallNowForm(request.POST) + if form.is_valid(): + ilo_host_address = form.cleaned_data["ilo_host_address"] + icinga_poll_status = form.cleaned_data["icinga_poll_status"] + if icinga_poll_status == "OK": + wrinstallnow = WrInstallNowService("wr", + ilo_host_address, + settings.ANSIBLE["wr"]["git"], + settings.ANSIBLE["wr"]["branch"], + settings.ANSIBLE["wr"]["playbook"], + settings.ANSIBLE["wr"]["zmq"]) + wrinstallnow.deploy() + return JsonResponse({"status": "OK"}) + else: + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error processing wrinstallnow: form input is invalid.") + else: + form = WrInstallNowForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "wrinstallnow.xml", context) + + +@csrf_exempt +def nicfirmwareupgradebatch(request): + if request.method == "POST": + form = PushButtonForm(request.POST) + if form.is_valid(): + firmware = FirmwareService(None, + settings.ANSIBLE["nic"]["git"], + settings.ANSIBLE["nic"]["branch"], + settings.ANSIBLE["nic"]["playbook"], + settings.ANSIBLE["nic"]["zmq"]) + firmware.deploy() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running nightly batch: somehow a form that takes no inputs is invalid") + else: + form = PushButtonForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "pushbutton.xml", context) + + +@csrf_exempt +def nightlybatch(request): + if request.method == "POST": + form = PushButtonForm(request.POST) + if form.is_valid(): + wr = WrService(None, + settings.ANSIBLE["wr"]["git"], + settings.ANSIBLE["wr"]["branch"], + settings.ANSIBLE["wr"]["playbook"], + settings.ANSIBLE["wr"]["zmq"]) + wr.deploy() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running nightly batch: somehow a form that takes no inputs is invalid") + else: + form = PushButtonForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "pushbutton.xml", context) + + +@csrf_exempt +def nightlypatch(request): + if request.method == "POST": + form = PushButtonForm(request.POST) + if form.is_valid(): + patch = PatchService(None, + settings.ANSIBLE["patch"]["git"], + settings.ANSIBLE["patch"]["branch"], + settings.ANSIBLE["patch"]["playbook"], + settings.ANSIBLE["patch"]["zmq"]) + patch.deploy() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running nightly patch: somehow a form that takes no inputs is invalid") + else: + form = PushButtonForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "pushbutton.xml", context) + + +@csrf_exempt +def wrfix(request): + if request.method == "POST": + form = WrRemediateForm(request.POST) + if form.is_valid(): + playbook = form.cleaned_data["playbook"] + cluster_name_list = form.cleaned_data["cluster_name_list"] + for cluster_name in list(cluster_name_list.split()): + wrinstallnow = WrInstallNowService(playbook, + cluster_name, + settings.ANSIBLE[playbook]["git"], + settings.ANSIBLE[playbook]["branch"], + settings.ANSIBLE[playbook]["playbook"], + settings.ANSIBLE[playbook]["zmq"]) + wrinstallnow.remediate() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running playbook: the form is invalid") + else: + form = WrRemediateForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "wrremediate.xml", context) + + +@csrf_exempt +def reboot(request): + if request.method == "POST": + form = WrRebootForm(request.POST) + if form.is_valid(): + namespace_name_list = form.cleaned_data["namespace_name_list"] + for namespace_name in list(namespace_name_list.split()): + wrinstallnow = WrInstallNowService("wr_reboot", + namespace_name, + settings.ANSIBLE["wr_reboot"]["git"], + settings.ANSIBLE["wr_reboot"]["branch"], + settings.ANSIBLE["wr_reboot"]["playbook"], + settings.ANSIBLE["wr_reboot"]["zmq"]) + wrinstallnow.remediate() + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running reboot: the form is invalid") + else: + form = WrRebootForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "wrremediate.xml", context) + +#created Oct30 2020 for Raj reboot testing delete later - Soda +@csrf_exempt +def mockreboot(request): + if request.method == "POST": + form = MockWrRebootForm(request.POST) + if form.is_valid(): + namespace_name_list = form.cleaned_data["namespace_name_list"] + for namespace_name in list(namespace_name_list.split()): + print(namespace_name) + return JsonResponse({"status": "OK"}) + else: + raise Exception("Error running Mock reboot: the form is invalid") + else: + form = MockWrRebootForm() + context = { + "title": "Mock Reboot Far-Edge Ops Middleware", + "form": form + } + return render(request, "mockwrremediate.xml", context) + +@csrf_exempt +def playbookreport(request): + if request.method == "POST": + form = PlaybookReportForm(request.POST) + if form.is_valid(): + report_kwargs = {"git": form.cleaned_data["git"], + "playbook": form.cleaned_data["playbook"], + "target": form.cleaned_data["target"], + "failed": form.cleaned_data["failed"]} + service = PlaybookReportService(**report_kwargs) + status = service.process() + return JsonResponse({"status": status}) + else: + raise Exception("Error receiving playbook report: form input is invalid.") + else: + form = PlaybookReportForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form + } + return render(request, "playbookreport.xml", context) + + +@csrf_exempt +def subcloud(request): + subclouds = None + if request.method == "POST": + form = SubcloudForm(request.POST) + if form.is_valid(): + subclouds = SubcloudService.find_subclouds(form.cleaned_data["fuze_id"]) + else: + raise Exception("Error finding subcloud: form input is invalid.") + else: + form = SubcloudForm() + context = { + "title": "Far-Edge Ops Middleware", + "form": form, + "subclouds": subclouds, + "fqdn": settings.DNS_DOMAIN + } + return render(request, "subcloud.xml", context) + + +# @csrf_exempt +# def fixcreds(request): +# if request.method == "POST": +# form = PushButtonForm(request.POST) +# if form.is_valid(): +# PasswordService.fix_creds() +# return JsonResponse({"status": "OK"}) +# else: +# form = PushButtonForm() +# context = { +# "title": "Far-Edge Ops Middleware", +# "form": form +# } +# return render(request, "pushbutton.xml", context) + + +# def fixcreds_success(request): +# return render(request, "ciq_success.xml") -- cgit v1.3