Merge branch 'fibre' of ssh://git.onelab.eu/git/myslice into fibre
[unfold.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', 'add_user_public_key', 'delete_user_public_key' ]
17
18     def __init__ ( self, organization ):
19        #self.url, self.key = self.getOrganizationConfigs( organization )
20        self.url = "https://portal.ufrj.fibre.org.br:3002/LS-Sched/"
21        self.key = "9763dd03f2da8138fb22a63d78e5e9792b59a637"
22
23     def __getattr__(self, name):
24         
25         def func(*args, **kwds):
26             actual_name = None
27             
28             if name in LaboraSchedulerClient.direct_calls:
29                 actual_name = name
30             
31             if not actual_name:
32                 raise Exception, "Method %s not found in Labora Scheduler"%(name)
33                 return
34                 
35             if not self.url or not self.key:
36                 raise Exception, "Missing Labora Scheduler island url and/or key."
37                 return
38                 
39             address = self.url + "?method=" + actual_name + "&key=" + self.key
40             
41             # get the direct_call parameters
42             method_parameters = []
43             
44             if actual_name == "get_users":
45                 method_parameters.extend(['filter'])
46             elif actual_name == "update_user":
47                 method_parameters.extend(['user_id', 'new_user_data'])
48             elif actual_name == "delete_user" or actual_name == "delete_user_public_key":
49                 method_parameters.extend(['user_id'])
50             elif actual_name == "get_user_id_by_username":
51                 method_parameters.extend(['username'])
52             elif actual_name == "add_user":
53                 method_parameters.extend(['username', 'email', 'password', 'name', 'gidnumber',
54                                           'homedirectory', 'created_by'])
55             elif actual_name == "add_user_public_key":
56                 method_parameters.extend(['user_id', 'public_key'])
57             
58             for parameter in args:
59                 if isinstance(parameter, (frozenset, list, set, tuple, dict)):
60                     for key_name in parameter.keys():
61                         
62                         if key_name in method_parameters:
63                             param_value = parameter[key_name]
64                             
65                             if param_value == None:
66                                 continue
67                             
68                             if isinstance(param_value, (frozenset, list, set, tuple, dict)):
69                                 param_value = json.dumps(param_value)
70                             
71                             param_value = urllib.quote(param_value.encode('utf-8'))
72                             
73                             address += "&" + key_name + "=" + param_value
74             
75             api_call = urllib2.urlopen(address)
76             api_call = json.load(api_call)
77             
78             if not api_call['call_status']:
79                 result = api_call['method_result']
80             else:
81                 result = False
82
83
84             return result
85             
86         return func
87         
88         
89     def getOrganizationConfigs( self, organization ):
90         ls_url = None
91         ls_key = None
92         
93         databaseConfig = {
94             'dbHost'        : '10.128.11.200',
95             'dbUser'        : 'postgres',
96             'dbPassword'    : '5e6b70f2e9dc',
97             'dbName'        : 'LaboraSchedulerNOC'
98         }
99         
100         databaseConnection = Database( databaseConfig )
101         
102         query = "SELECT * FROM islands WHERE domain ='" + organization + "'"
103         orgConfig = databaseConnection.fetchRows( query )
104
105         if orgConfig:
106             ls_url = orgConfig[0]["ls_url"]
107             ls_key = orgConfig[0]["ls_key"]
108         
109         return ls_url, ls_key