97e2a3030b86cb5992d6ddb7ed9237afe1a9c612
[plstackapi.git] / planetstack / hpc_observer / hpclib.py
1 import os
2 import base64
3 import sys
4 import xmlrpclib
5
6 if __name__ == '__main__':
7     sys.path.append("/opt/planetstack")
8     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
9
10 from planetstack.config import Config
11 from core.models import Service
12 from hpc.models import HpcService
13 from requestrouter.models import RequestRouterService
14 from util.logger import Logger, logging
15
16 logger = Logger(level=logging.INFO)
17
18 class APIHelper:
19     def __init__(self, proxy, auth, method=None):
20         self.proxy = proxy
21         self.auth = auth
22         self.method = method
23
24     def __getattr__(self, name):
25         if name.startswith("_"):
26             return getattr(self, name)
27         else:
28             return APIHelper(self.proxy, self.auth, name)
29
30     def __call__(self, *args):
31         method = getattr(self.proxy, self.method)
32         return method(self.auth, *args)
33
34 class CmiClient:
35     def __init__(self, hostname, port=8003, username="apiuser", password="apiuser"):
36         self.connect_api(hostname, port, username, password)
37
38     def connect_api(self, hostname, port=8003, username="apiuser", password="apiuser"):
39         #print "https://%s:%d/COAPI/" % (hostname, port)
40         cob = xmlrpclib.ServerProxy("https://%s:%d/COAPI/" % (hostname, port), allow_none=True)
41         cob_auth = {}
42         cob_auth["Username"] = username
43         cob_auth["AuthString"] = password
44         cob_auth["AuthMethod"] = "password"
45
46         onev = xmlrpclib.ServerProxy("https://%s:%d/ONEV_API/" % (hostname, port), allow_none=True)
47         onev_auth = {}
48         onev_auth["Username"] = username
49         onev_auth["AuthString"] = password
50         onev_auth["AuthMethod"] = "password"
51
52         self.cob = APIHelper(cob, cob_auth)
53         self.onev = APIHelper(onev, onev_auth)
54
55 class HpcLibrary:
56     def extract_slice_info(self, service):
57         """ Produce a dict that describes the slices for the CMI
58
59             slice_coblitz = <name of coblitz slice>
60             service_coblitz = <name of coblitz service>
61             hostname_coblitz = <name of first coblitz slice>
62             hostnames_coblitz = <name_of_first_cob_slice>,<name_of_second_cob_slice>,...
63
64             slice_cmi = <name of cmi slice>
65             ...
66         """
67
68         slicenames = {}
69         slicehosts = {}
70         for slice in service.service.all():
71             name = slice.name
72             if not ("_" in name):
73                 continue
74
75             if "coblitz" in name:
76                 slicenames["coblitz"] = name
77                 slicehosts["coblitz"] = [sliver.node.name for sliver in slice.slivers.all()]
78             elif "cmi" in name:
79                 slicenames["cmi"] = name
80                 slicehosts["cmi"] = [sliver.node.name for sliver in slice.slivers.all()]
81             elif "dnsredir" in name:
82                 slicenames["dnsredir"] = name
83                 slicehosts["dnsredir"] = [sliver.node.name for sliver in slice.slivers.all()]
84             elif "dnsdemux" in name:
85                 slicenames["dnsdemux"] = name
86                 slicehosts["dnsdemux"] = [sliver.node.name for sliver in slice.slivers.all()]
87
88         base_hrn = None
89         if "coblitz" in slicenames:
90             base_hrn = slicenames["coblitz"].split("_")[0]
91
92         mapping = {}
93         mapping["base_hrn"] = base_hrn
94         for (k,v) in slicenames.items():
95             mapping["slice_" + k] = v
96             mapping["service_" + k] = v.split("_",1)[1]
97         for (k,v) in slicehosts.items():
98             mapping["hostname_" + k] = v[0]
99             mapping["hostnames_" + k] = ",".join(v)
100
101         return mapping
102
103     def get_cmi_hostname(self, hpc_service=None):
104         if (hpc_service is None):
105             hpc_service = HpcService.objects.get()
106
107         slice_info = self.extract_slice_info(hpc_service)
108         return slice_info["hostname_cmi"]
109
110     def write_slices_file(self, hpc_service=None, rr_service=None):
111         if (hpc_service is None):
112             hpc_service = HpcService.objects.get()
113
114         if (rr_service is None):
115             rr_service = RequestRouterService.objects.get()
116
117         mapping = self.extract_slice_info(hpc_service)
118         rr_mapping = self.extract_slice_info(rr_service)
119
120         mapping.update(rr_mapping)
121
122         fn = "/tmp/slices"
123
124         f = open(fn, "w")
125         f.write("""
126 ENABLE_PLC=True
127 ENABLE_PS=False
128 BASE_HRN="%(base_hrn)s"
129 RELEVANT_SERVICE_NAMES=['%(service_coblitz)s', '%(service_dnsredir)s', '%(service_dnsdemux)s']
130 COBLITZ_SLICE_NAME="%(slice_coblitz)s"
131 COBLITZ_SLICE_ID=1
132 COBLITZ_PS_SLICE_NAME="%(slice_coblitz)s"
133 DNSREDIR_SLICE_NAME="%(slice_dnsredir)s"
134 DNSREDIR_SLICE_ID=2
135 DNSREDIR_PS_SLICE_NAME="%(slice_dnsredir)s"
136 DNSDEMUX_SLICE_NAME="%(slice_dnsdemux)s"
137 DNSDEMUX_SLICE_ID=3
138 DNSDEMUX_PS_SLICE_NAME="%(slice_dnsdemux)s"
139 CMI_URL="http://%(hostname_cmi)s"
140 CMI_HTTP_PORT="8004"
141 CMI_HTTPS_PORT="8003"
142 PUPPET_MASTER_HOSTNAME="%(hostname_cmi)s"
143 PUPPET_MASTER_PORT="8140"
144 """ % mapping)
145
146 if __name__ == '__main__':
147     print "testing write_slices_file"
148     lib = HpcLibrary()
149     lib.write_slices_file()
150
151     print "testing API connection"
152     client = CmiClient(lib.get_cmi_hostname())
153     client.cob.GetNewObjects()
154     client.onev.ListAll("CDN")
155
156
157
158