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 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")