37d35b4b37b636712a55e0ed93bb259890e4a8c3
[plstackapi.git] / planetstack / tests / GetConfiguration.py
1 import os
2 import json
3 import sys
4 import time
5
6 sys.path.append("/opt/planetstack")
7
8 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
9 from openstack.manager import OpenStackManager
10 from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
11
12 def ps_id_to_pl_id(x):
13     return 10000 + x
14
15 def filter_fields(src, fields):
16     dest = {}
17     for (key,value) in src.items():
18         if (not fields) or (key in fields):
19             dest[key] = value
20     return dest
21
22 def GetSlices(filter={}):
23     ps_slices = Slice.objects.filter(**filter)
24     slices = []
25     for ps_slice in ps_slices:
26         node_ids=[]
27         for ps_sliver in ps_slice.slivers.all():
28             node_ids.append(ps_id_to_pl_id(ps_sliver.node.id))
29
30         slice = {"instantiation": "plc-instantiated",
31                  "description": "planetstack slice",
32                  "slice_id": ps_id_to_pl_id(ps_slice.id),
33                  "node_ids": node_ids,
34                  "url": "planetstack",
35                  "max_nodes": 1000,
36                  "peer_slice_id": None,
37                  "slice_tag_ids": [],
38                  "peer_id": None,
39                  "site_id": ps_id_to_pl_id(ps.site_id),
40                  "name": ps_slice.name}
41
42                  # creator_person_id, person_ids, expires, created
43
44         slices.append(slice)
45     return slices
46
47 def GetNodes(node_ids, fields=None)
48     ps_nodes = Node.objects.filter(id__in=node_ids)
49     nodes = []
50     for ps_node in ps_nodes:
51         slice_ids=[]
52         for ps_sliver in ps_node.slivers.all():
53             slice_ids.append(ps_id_to_pl_id(ps_sliver.slice.id))
54
55         node = {"node_id": ps_id_to_pl_id(ps_node.id),
56                 "site_id": ps_id_to_pl_id(ps_node.site_id),
57                 "node_type": "regular",
58                 "peer_node_id": None,
59                 "hostname": node.name,
60                 "conf_file_ids": [],
61                 "slice_ids": slice_ids,
62                 "model": "planetstack",
63                 "peer_id": None,
64                 "node_tag_ids": []}
65
66                 # last_updated, key, boot_state, pcu_ids, node_type, session, last_boot,
67                 # interface_ids, slice_ids_whitelist, run_level, ssh_rsa_key, last_pcu_reboot,
68                 # nodegroup_ids, verified, last_contact, boot_nonce, version,
69                 # last_pcu_configuration, last_download, date_created, ports
70
71         nodes.append(node)
72
73     nodes = [filter_fields(node, fields) for node in nodes]
74
75     return nodes
76
77 def GetTags(slicename,node_id):
78     return []
79
80 def GetSites():
81     ps_sites = Site.objects.all()
82     sites = []
83     for ps_site in ps_sites:
84         slice_ids=[]
85         for ps_slice in ps_site.slices.all():
86             slice_ids.append(ps_id_to_pl_id(ps_slice.id))
87
88         node_ids=[]
89         for ps_node in ps_site.nodes.all():
90             node_ids.append(ps_id_to_pl_id(ps_node.id))
91
92
93         site = {"site_id": ps_id_to_pl_id(ps_site.id),
94                 "node_ids": node_ids,
95                 "pcu_ids": [],
96                 "max_slices": 100,
97                 "max_slivers": 1000,
98                 "is_public": False,
99                 "peer_site_id": None,
100                 "abbrebiated_name": ps_site.abbreviated_name,
101                 "address_ids": [],
102                 "name": ps_site.name,
103                 "url": None,
104                 "site_tag_ids": [],
105                 "enabled": True,
106                 "longitude": float(ps_site.location.longitude),
107                 "latitude": float(ps_site.location.latitude),
108                 "slice_ids": slice_ids,
109                 "login_base": ps_site.login_base,
110                 "peer_id": None}
111
112                 # last_updated, ext_consortium_id, person_ids, date_created
113
114         sites.append(site)
115
116     return sites
117
118
119 def GetConfigurations(name):
120     slicename = name["name"]
121     if "node_id" in name:
122         node_id = name["node_id"]
123     else:
124         node_id = 0
125
126     slices = GetSlices({"name": slicename})
127     perhost = {}
128     allinterfaces = {}
129     hostipmap = {}
130     nodes = []
131     if len(slices)==1:
132         slice = slices[0]
133         node_ids = slice['node_ids']
134         nodes = GetNodes(node_ids, ['hostname', 'node_id', 'site_id'])
135         nodemap = {}
136         for node in nodes:
137             nodemap[node['node_id']]=node['hostname']
138
139         # interfaces
140
141         for nid in node_ids:
142             sliver_tags = GetTags(slicename,nid)
143             perhost[nodemap[nid]] = sliver_tags
144
145     slivers = GetSlices()
146     if node_id != 0:
147         slivers = [slice for slice in slivers if (node_id in slice.node_ids)]
148
149     sites = GetSites()
150     for site in sites:
151         site["site_tags"] = []
152
153     timestamp = int(time.time())
154     return {'version': 3,
155             'timestamp': timestamp,
156             'configuration': node_sliver_tags,
157             'allconfigurations':perhost,
158             'hostipmap':hostipmap,
159             'slivers': slivers,
160             'interfaces': allinterfaces,
161             'sites': sites,
162             'nodes': nodes}
163
164
165