start working on xoslib
[plstackapi.git] / planetstack / core / xoslib / xoslib.py
1 # /opt/planetstack/core/dashboard/views/helloworld.py
2 import datetime
3 import os
4 import sys
5 import time
6 import json
7 from django.http import HttpResponse, HttpResponseServerError, HttpResponseForbidden
8 from django.views.generic import TemplateView, View
9 from core.models import *
10 from django.forms.models import model_to_dict
11
12 def ensure_serializable(d):
13     d2={}
14     for (k,v) in d.items():
15         # datetime is not json serializable
16         if isinstance(v, datetime.datetime):
17             d2[k] = time.mktime(v.timetuple())
18         elif v.__class__.__name__ == "Geoposition":
19             pass
20         else:
21             d2[k] = v
22     return d2
23
24 def sliver_to_dict(sliver):
25     d = model_to_dict(sliver)
26     d["slice_id"] = sliver.slice.id
27     d["node_id"] = sliver.node.id
28     return d
29
30 def slice_to_dict(slice):
31     d = model_to_dict(slice)
32     d["slivers"] = [sliver_to_dict(x) for x in slice.slivers]
33     return d
34
35 def node_to_dict(node):
36     d = model_to_dict(node)
37     d["slivers"] = []
38
39
40 class OpenCloudData:
41     def __init__(self, user):
42         self.loadAll()
43
44     def loadAll(self):
45         self.allNodes = list(Node.objects.all())
46         self.allSlices = list(Slice.objects.all())
47         self.allSlivers = list(Sliver.objects.all())
48         self.allSites = list(Site.objects.all())
49
50         self.site_id = {}
51         for site in self.allSites:
52             d = model_to_dict(site)
53             d["node_ids"] = []
54             d["slice_ids"] = []
55             self.site_id[site.id] = ensure_serializable(d)
56
57         self.node_id = {}
58         for node in self.allNodes:
59             d = model_to_dict(node)
60             d["sliver_ids"] = []
61             self.node_id[node.id] = ensure_serializable(d)
62             self.site_id[node.site_id]["node_ids"].append(node.id)
63
64         self.slice_id = {}
65         for slice in self.allSlices:
66             d = model_to_dict(slice)
67             d["sliver_ids"] = []
68             self.slice_id[slice.id] = ensure_serializable(d)
69             self.site_id[slice.site_id]["slice_ids"].append(site.id)
70
71         self.sliver_id = {}
72         for sliver in self.allSlivers:
73             self.sliver_id[sliver.id] = model_to_dict(sliver)
74
75             self.slice_id[sliver.slice_id]["sliver_ids"].append(sliver.id)
76             self.node_id[sliver.node_id]["sliver_ids"].append(sliver.id)
77
78     def get_opencloud_data(self):
79         return {"slices": self.slice_id.values(),
80                 "slivers": self.sliver_id.values(),
81                 "nodes": self.node_id.values(),
82                 "sites": self.site_id.values()}
83
84 class ShellDataView(View):
85     url = r'^shelldata/'
86
87     def get(self, request, **kwargs):
88         result = OpenCloudData(request.user).get_opencloud_data()
89
90         return HttpResponse(json.dumps(result), mimetype='application/json')