db07211eb3d57f098e037f77a1ee023b33d1c6bc
[sfa.git] / util / pl_to_geni.py
1 import sys
2 from pg import DB
3 from db import *
4 from util import *
5
6 PL_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
7         
8 #given a login_base or site_id (which are ids of a site in Planetlab), determines the hierarchical name of it in GENI
9 def site_to_auth(id_or_loginbase):
10     cnx = get_plDB_conn()
11     site_id = None
12     hrn = None
13     loginbase = None
14     if isinstance(id_or_loginbase, int):
15         site_id = id_or_loginbase
16         querystr = "SELECT login_base FROM sites WHERE site_id = "+str(id_or_loginbase)
17         res = cnx.query(querystr).dictresult()
18         if res:
19             loginbase = res[0]['login_base']
20         else:
21             return None
22     else:
23         loginbase = id_or_loginbase
24         #get site_id
25         querystr = "SELECT site_id FROM sites WHERE login_base = '"+loginbase+"'"
26         res = cnx.query(querystr).dictresult()
27         if res:
28             site_id = res[0]['site_id']
29         else:
30             return None
31     #search login_base in trees
32     (sr_tree, cr_tree) = get_tree_globals()
33     hrn = site_to_auth_rec(loginbase, sr_tree.my_tree)
34     if not hrn:
35         hrn = site_to_auth_rec(loginbase, cr_tree.my_tree)
36     if not hrn:
37         return None
38     else:
39         return (site_id, hrn)
40     
41 def site_to_auth_rec(loginbase, treenode):
42     if treenode.info.login_base and treenode.info.login_base == loginbase:
43         return treenode.info.name
44     else:
45         for child in treenode.children:
46             name = site_to_auth_rec(loginbase, child)
47             if name:
48                 return name
49     return None
50     
51 def hrn_to_loginbase(hrn, algorithm=0):
52     hrn_arr = hrn.split('.')
53     j = len(hrn_arr)-2
54     alg_count = algorithm-1 
55     login_base = hrn_arr[len(hrn_arr)-1]
56     while j>=0 and alg_count>=0:
57         if alg_count == 0:
58             login_base = login_base+hrn_arr[j]
59         j = j-1
60         alg_count = alg_count-1
61     if len(login_base) > 20:
62         return login_base[0:20]
63     else:
64         return login_base
65         
66     
67 #given an email or person_id (which are ids of a person in Planetlab), determined the last portion of hierarchical name of it in GENI
68 def person_to_user(email, algorithm = 0):
69     hrn_suffix = ''
70     if algorithm == 0:
71         hrn_suffix = email.split('@')[0].replace('.','-')
72     elif algorithm == 1:
73         hrn_suffix = email.split('@')[0].replace('.','-')+'-'+email.split('@')[1].split('.')[0]
74     elif algorithm == 2:
75         hrn_suffix = email.replace('@','-')
76         hrn_suffix = hrn_suffix.replace('.','-')
77     return hrn_suffix
78     
79 def plslice_to_slice(slice_name):
80     i = 0
81     while slice_name[i]!='_':
82         i = i+1
83     return slice_name[i+1:len(slice_name)]
84     
85 def plnode_to_node(hostname, algorithm = 0):
86     hrn_suffix = ''
87     if algorithm == 0:
88         hrn_suffix = hostname.split('.')[0]
89     elif algorithm == 1:
90         hrn_suffix = hostname.split('.')[0]+'-'+hostname.split('.')[1]
91     elif algorithm == 2:
92         hrn_suffix = hrn_suffix.replace('.','-')
93     return hrn_suffix
94     
95 def check_exists_pl(cnx, pointer, type):
96     exists = True
97     if type == 'SA' or type == 'MA':
98         res = cnx.query("SELECT deleted FROM sites WHERE site_id = "+str(pointer)).dictresult()
99         if len(res)==0 or res[0]['deleted'] == 't':
100             exists = False
101     elif type == 'slice':
102         res = cnx.query("SELECT is_deleted FROM slices WHERE slice_id = "+str(pointer)).dictresult()
103         if len(res)==0 or res[0]['is_deleted'] == 't':
104             exists = False
105     elif type == 'user':
106         res = cnx.query("SELECT deleted FROM persons WHERE person_id = "+str(pointer)).dictresult()
107         if len(res)==0 or res[0]['deleted'] == 't':
108             exists = False
109     elif type == 'node':
110         res = cnx.query("SELECT deleted FROM nodes WHERE node_id = "+str(pointer)).dictresult()
111         if len(res)==0 or res[0]['deleted'] == 't':
112             exists = False
113     return exists
114     
115 def check_exists_geni(record, dbinfo):
116     cnx = dbinfo[0]
117     table = dbinfo[1] 
118     try:
119         #lookup in GENI tables
120         geni_res = cnx.query("SELECT * FROM "+table+" WHERE hrn = '"+get_leaf(record['g_params']["hrn"])+"' ").dictresult()
121         if geni_res:
122             return geni_res[0]
123         else:
124             return None
125     except:
126         return None
127         
128 #fill the geni table with the records in PL database
129 #login_base: indicates the site in PL
130 #tablename: the GENI table name
131 #type: 'slice' or 'component' indicating the registry type of the GENI table
132 def populate_pl_data(login_base, tablename, type):
133     cnx = get_plDB_conn()
134     site_id = cnx.query("SELECT site_id FROM sites WHERE login_base='"+login_base+"';").dictresult()[0]['site_id']
135     
136     if type == 'slice': #slice registry
137         #populate user records
138         querystr = "SELECT p.person_id, p.email FROM persons as p, person_site as ps WHERE p.person_id = ps.person_id AND  ps.site_id = "+str(site_id)
139         users = cnx.query(querystr).dictresult()
140         for user in users:
141             new_hrn = person_to_user(user['email'])
142             existing = cnx.query("SELECT * FROM "+tablename+" WHERE hrn = '"+new_hrn+"'; ").dictresult()
143             if len(existing) > 0:
144                 new_hrn = person_to_user(user['email'], 1)
145                 existing = cnx.query("SELECT * FROM "+tablename+" WHERE hrn = '"+new_hrn+"'; ").dictresult()
146                 if len(existing) > 0:
147                     new_hrn = person_to_user(user['email'], 2)
148             cnx.query("INSERT INTO "+tablename+"(hrn,type,wrapperurl,pointer) VALUES('"+new_hrn+"','user','local',"+str(user['person_id'])+")")
149         #populate slice records
150         querystr = "SELECT slice_id, name FROM slices WHERE site_id = "+str(site_id)
151         slices = cnx.query(querystr).dictresult()
152         for slice in slices:
153             slcname = slice['name'].split('_')
154             if slcname[len(slcname)-1] != 'deleted':
155                 new_hrn = plslice_to_slice(slice['name'])
156                 existing = cnx.query("SELECT * FROM "+tablename+" WHERE hrn = '"+new_hrn+"'; ").dictresult()
157                 if len(existing) > 0:
158                     new_hrn = new_hrn+'-'+str(slice['slice_id'])
159                 cnx.query("INSERT INTO "+tablename+"(hrn,type,wrapperurl,pointer) VALUES('"+new_hrn+"','slice','local',"+str(slice['slice_id'])+")")
160                 
161     if type == 'component': #component registry
162         #populate node records
163         querystr = "SELECT node_id, hostname FROM nodes WHERE site_id = "+str(site_id)
164         nodes = cnx.query(querystr).dictresult()
165         for node in nodes:
166             new_hrn = plnode_to_node(node['hostname'], 0)
167             existing = cnx.query("SELECT * FROM "+tablename+" WHERE hrn = '"+new_hrn+"'; ").dictresult()
168             if len(existing) > 0:
169                 new_hrn = plnode_to_node(node['hostname'], 1)
170                 existing = cnx.query("SELECT * FROM "+tablename+" WHERE hrn = '"+new_hrn+"'; ").dictresult()
171                 if len(existing) > 0:
172                     new_hrn = plnode_to_node(node['hostname'], 2)
173             cnx.query("INSERT INTO "+tablename+"(hrn,type,wrapperurl,pointer) VALUES('"+new_hrn+"','node','local',"+str(node['node_id'])+")")
174