6 from urlparse import urlparse
7 from database import Database
9 class LaboraSchedulerClient:
11 A simple rest shell to a Labora Scheduler instance
12 This class can receive Labora API calls to the underlying testbed
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' ]
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"
23 def __getattr__(self, name):
25 def func(*args, **kwds):
28 if name in LaboraSchedulerClient.direct_calls:
32 raise Exception, "Method %s not found in Labora Scheduler"%(name)
35 if not self.url or not self.key:
36 raise Exception, "Missing Labora Scheduler island url and/or key."
39 address = self.url + "?method=" + actual_name + "&key=" + self.key
41 # get the direct_call parameters
42 method_parameters = []
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'])
58 for parameter in args:
59 if isinstance(parameter, (frozenset, list, set, tuple, dict)):
60 for key_name in parameter.keys():
62 if key_name in method_parameters:
63 param_value = parameter[key_name]
65 if param_value == None:
68 if isinstance(param_value, (frozenset, list, set, tuple, dict)):
69 param_value = json.dumps(param_value)
71 param_value = urllib.quote(param_value.encode('utf-8'))
73 address += "&" + key_name + "=" + param_value
75 api_call = urllib2.urlopen(address)
76 api_call = json.load(api_call)
78 if not api_call['call_status']:
79 result = api_call['method_result']
89 def getOrganizationConfigs( self, organization ):
94 'dbHost' : '10.128.11.200',
95 'dbUser' : 'postgres',
96 'dbPassword' : '5e6b70f2e9dc',
97 'dbName' : 'LaboraSchedulerNOC'
100 databaseConnection = Database( databaseConfig )
102 query = "SELECT * FROM islands WHERE domain ='" + organization + "'"
103 orgConfig = databaseConnection.fetchRows( query )
106 ls_url = orgConfig[0]["ls_url"]
107 ls_key = orgConfig[0]["ls_key"]
109 return ls_url, ls_key