-> Removed registration based on LDAP.
[myslice.git] / portal / lsapiclient.py
1 import sys
2 import urllib
3 import urllib2
4 import json
5 import socket
6 from urlparse import urlparse
7 from database import Database
8
9 class LaboraSchedulerClient:
10     """
11     A simple rest shell to a Labora Scheduler instance
12     This class can receive Labora API  calls to the underlying testbed
13     """
14                 
15     direct_calls = [ 'get_testbed_info', 'get_users', 'add_user', 'delete_user', 'update_user',
16                      'get_user_id_by_username' ]
17
18     def __init__ ( self, organization ):
19         self.url, self.key = self.getOrganizationConfigs( organization )
20
21
22     def __getattr__(self, name):
23         
24         def func(*args, **kwds):
25             actual_name = None
26             
27             if name in LaboraSchedulerClient.direct_calls:
28                 actual_name = name
29             
30             if not actual_name:
31                 raise Exception, "Method %s not found in Labora Scheduler"%(name)
32                 return
33                 
34             if not self.url or not self.key:
35                 raise Exception, "Missing Labora Scheduler island url and/or key."
36                 return
37                 
38             address = self.url + "?method=" + actual_name + "&key=" + self.key
39             
40             # get the direct_call parameters
41             method_parameters = []
42             
43             if actual_name == "get_users":
44                 method_parameters.extend(['filter'])
45             elif actual_name == "update_user":
46                 method_parameters.extend(['user_id', 'new_user_data'])
47             elif actual_name == "delete_user":
48                 method_parameters.extend(['user_id'])
49             elif actual_name == "get_user_id_by_username":
50                 method_parameters.extend(['username'])
51             elif actual_name == "add_user":
52                 method_parameters.extend(['username', 'email', 'password', 'name', 'gidnumber',
53                                           'homedirectory'])
54             
55             for parameter in args:
56                 if isinstance(parameter, (frozenset, list, set, tuple, dict)):
57                     for key_name in parameter.keys():
58                         
59                         if key_name in method_parameters:
60                             param_value = parameter[key_name]
61                             
62                             if param_value == None:
63                                 continue
64                             
65                             if isinstance(param_value, (frozenset, list, set, tuple, dict)):
66                                 param_value = json.dumps(param_value)
67                             
68                             param_value = urllib.quote(param_value.encode('utf-8'))
69                             
70                             address += "&" + key_name + "=" + param_value
71             
72             api_call = urllib2.urlopen(address)
73             api_call = json.load(api_call)
74             
75             if not api_call['call_status']:
76                 result = api_call['method_result']
77             else:
78                 result = False
79
80
81             return result
82             
83         return func
84         
85         
86     def getOrganizationConfigs( self, organization ):
87         ls_url = None
88         ls_key = None
89         
90         databaseConfig = {
91             'dbHost'        : '10.128.11.200',
92             'dbUser'        : '',
93             'dbPassword'    : '',
94             'dbName'        : 'LaboraSchedulerNOC'
95         }
96         
97         databaseConnection = Database( databaseConfig )
98         
99         query = "SELECT * FROM islands WHERE domain ='" + organization + "'"
100         orgConfig = databaseConnection.fetchRows( query )
101
102         if orgConfig:
103             ls_url = orgConfig[0]["ls_url"]
104             ls_key = orgConfig[0]["ls_key"]
105         
106         return ls_url, ls_key