Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 1 | from django.http import HttpResponse, HttpResponseServerError |
| 2 | from core.models import * |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 3 | from rest_framework.views import APIView |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 4 | from services.hpc.models import * |
Scott Baker | 6ecad3b | 2016-08-09 09:01:55 -0700 | [diff] [blame] | 5 | #from services.requestrouter.models import * |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 6 | import xos.settings |
| 7 | import json |
| 8 | import os |
| 9 | import time |
| 10 | |
| 11 | def get_service_slices(service): |
| 12 | try: |
| 13 | return service.slices.all() |
| 14 | except: |
| 15 | # this field used to be improperly named, and makemigrations won't fix it |
| 16 | return service.service.all() |
| 17 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 18 | class HpcConfig(APIView): |
| 19 | method_kind = "list" |
| 20 | method_name = "hpcconfig" |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 21 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 22 | def get(self, request, format=None): |
| 23 | hpcSlice=None |
| 24 | cmiSlice=None |
| 25 | redirSlice=None |
| 26 | demuxSlice=None |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 27 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 28 | node_slicename = request.GET.get("slicename", None) |
| 29 | if not node_slicename: |
| 30 | return HttpResponseServerError("Error: no slicename passed in request") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 31 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 32 | # search for an HPC Service that owns the slicename that was passed |
| 33 | # to us. |
| 34 | hpc=None |
| 35 | for candidate in HpcService.objects.all(): |
| 36 | if candidate.cmi_hostname == node_slicename: |
| 37 | # A hack for standalone CMIs that aren't managed by XOS. Set |
| 38 | # /etc/slicename to cmi_hostname that's configured in the |
| 39 | # HPCService object. |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 40 | hpc = candidate |
| 41 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 42 | for slice in get_service_slices(candidate): |
| 43 | if slice.name == node_slicename: |
| 44 | hpc = candidate |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 45 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 46 | if (not hpc): |
| 47 | return HttpResponseServerError("Error: no HPC service") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 48 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 49 | for slice in get_service_slices(hpc): |
| 50 | if "cmi" in slice.name: |
| 51 | cmiSlice = slice |
| 52 | elif ("hpc" in slice.name) or ("vcoblitz" in slice.name): |
| 53 | hpcSlice = slice |
| 54 | elif "redir" in slice.name: |
| 55 | redirSlice = slice |
| 56 | elif "demux" in slice.name: |
| 57 | demuxSlice = slice |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 58 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 59 | if (hpc.cmi_hostname): |
| 60 | cmi_hostname = hpc.cmi_hostname |
| 61 | else: |
| 62 | if not cmiSlice: |
| 63 | return HttpResponseServerError("Error: no CMI slice") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 64 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 65 | if len(cmiSlice.instances.all())==0: |
| 66 | return HttpResponseServerError("Error: CMI slice has no instances") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 67 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 68 | # for now, assuming using NAT |
| 69 | cmi_hostname = cmiSlice.instances.all()[0].node.name |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 70 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 71 | if not hpcSlice: |
| 72 | return HttpResponseServerError("Error: no HPC slice") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 73 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 74 | # if (redirSlice==None) or (demuxSlice==None): |
| 75 | # # The HPC Service didn't have a dnsredir or a dnsdemux, so try looking |
| 76 | # # in the RequestRouterService for one. |
| 77 | # |
| 78 | # rr = RequestRouterService.objects.all() |
| 79 | # if not (rr): |
| 80 | # return HttpResponseServerError("Error: no RR service") |
| 81 | # |
| 82 | # rr = rr[0] |
| 83 | # try: |
| 84 | # slices = rr.slices.all() |
| 85 | # except: |
| 86 | # # this field used to be improperly named, and makemigrations won't fix it |
| 87 | # slices = rr.service.all() |
| 88 | # for slice in slices: |
| 89 | # if "redir" in slice.name: |
| 90 | # redirSlice = slice |
| 91 | # elif "demux" in slice.name: |
| 92 | # demuxSlice = slice |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 93 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 94 | if not redirSlice: |
| 95 | return HttpResponseServerError("Error: no dnsredir slice") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 96 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 97 | if not demuxSlice: |
| 98 | return HttpResponseServerError("Error: no dnsdemux slice") |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 99 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 100 | d = {} |
| 101 | d["hpc_slicename"] = hpcSlice.name |
| 102 | d["redir_slicename"] = redirSlice.name |
| 103 | d["demux_slicename"] = demuxSlice.name |
| 104 | d["cmi_hostname"] = cmi_hostname |
| 105 | d["xos_hostname"] = xos.settings.RESTAPI_HOSTNAME |
| 106 | d["xos_port"] = str(xos.settings.RESTAPI_PORT) |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 107 | |
Scott Baker | c2a4d32 | 2016-08-09 09:16:57 -0700 | [diff] [blame] | 108 | if hpc.hpc_port80: |
| 109 | d["hpc_port80"] = "True" |
| 110 | else: |
| 111 | d["hpc_port80"] = "False" |
| 112 | |
| 113 | return HttpResponse("""# auto-generated by HpcConfig |
| 114 | ENABLE_PLC=False |
| 115 | ENABLE_PS=True |
| 116 | BASE_HRN="princeton" |
| 117 | RELEVANT_SERVICE_NAMES=['vcoblitz', 'coredirect', 'codnsdemux', "syndicate_comon_server"] |
| 118 | COBLITZ_SLICE_NAME=BASE_HRN+"_vcoblitz" |
| 119 | COBLITZ_SLICE_ID=70 |
| 120 | COBLITZ_PS_SLICE_NAME="{hpc_slicename}" |
| 121 | DNSREDIR_SLICE_NAME=BASE_HRN+"_coredirect" |
| 122 | DNSREDIR_SLICE_ID=71 |
| 123 | DNSREDIR_PS_SLICE_NAME="{redir_slicename}" |
| 124 | DNSDEMUX_SLICE_NAME=BASE_HRN+"_codnsdemux" |
| 125 | DNSDEMUX_SLICE_ID=69 |
| 126 | DNSDEMUX_PS_SLICE_NAME="{demux_slicename}" |
| 127 | CMI_URL="http://{cmi_hostname}/" |
| 128 | CMI_HTTP_PORT="8004" |
| 129 | CMI_HTTPS_PORT="8003" |
| 130 | PUPPET_MASTER_HOSTNAME="{cmi_hostname}" |
| 131 | PUPPET_MASTER_PORT="8140" |
| 132 | PS_HOSTNAME="{xos_hostname}" |
| 133 | PS_PORT="{xos_port}" |
| 134 | COBLITZ_PORT_80={hpc_port80} |
| 135 | """.format(**d)) |
Scott Baker | 25467ff | 2016-08-04 09:50:22 -0700 | [diff] [blame] | 136 | |