X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=rest%2Fsfa_api.py;h=d531f13b4ed37292513d135e48ae2aad11b4087c;hb=2a91f686e983547fcbc6ac4057025c26b6335667;hp=bad67736df5f6ed8581b0a34732682ea35f4fb8c;hpb=a76069e44a3158e4c0a6af1d82fdb88591d01ed3;p=unfold.git diff --git a/rest/sfa_api.py b/rest/sfa_api.py index bad67736..d531f13b 100644 --- a/rest/sfa_api.py +++ b/rest/sfa_api.py @@ -20,24 +20,21 @@ from manifold.models.user import User from unfold.loginrequired import LoginRequiredView -from myslice.settings import logger +from myslice.settings import logger, config from rest.json_encoder import MyEncoder def dispatch(request, method): - Config = ConfigParser.ConfigParser() - Config.read(os.getcwd() + "/myslice/monitor.ini") - - #logger.debug(request.session['user']['email']) - user_email = request.session['user']['email'] - platforms = list() - options = dict() - rspec = '' - results = dict() - urn = '' hrn = '' + urn = '' object_type = '' + rspec = '' + recursive = False + options = dict() + platforms = list() + + results = dict() display = None if request.method == 'POST': @@ -58,9 +55,66 @@ def dispatch(request, method): urn = el[1] elif el[0].startswith('type'): object_type = el[1] + elif el[0].startswith('recursive'): + if el[1] == '1': + recursive = True + else: + recursive = False elif el[0].startswith('display'): display = el[1] + results = sfa_client(request, method, hrn, urn, object_type, recursive, options, platforms) + logger.debug(results) + if display == 'table': + return render_to_response('table-default.html', {'data' : data, 'fields' : columns, 'id' : '@component_id', 'options' : None}) + else: + return HttpResponse(json.dumps(results, cls=MyEncoder), content_type="application/json") + +def get_user_account(user_email, platform_name): + """ + Returns the user configuration for a given platform. + This function does not resolve references. + """ + user = db.query(User).filter(User.email == user_email).one() + platform = db.query(Platform).filter(Platform.platform == platform_name).one() + accounts = [a for a in user.accounts if a.platform == platform] + if not accounts: + raise Exception, "this account does not exist" + + if accounts[0].auth_type == 'reference': + pf = json.loads(accounts[0].config)['reference_platform'] + return get_user_account(user_email, pf) + + return accounts[0] + +def sfa_client(request, method, hrn=None, urn=None, object_type=None, rspec=None, recursive=None, options=None, platforms=None, admin=False): + + Config = ConfigParser.ConfigParser() + Config.read(os.getcwd() + "/myslice/myslice/monitor.ini") + + if admin: + user_email, admin_password = config.manifold_admin_user_password() + else: + #logger.debug(request.session['user']['email']) + user_email = request.session['user']['email'] + + results = dict() + + if hrn is None: + hrn = '' + if urn is None: + urn = '' + if object_type is None: + object_type = '' + if rspec is None: + rspec = '' + if recursive is None: + recursive = False + if options is None: + options = dict() + if platforms is None: + platforms = list() + if method not in ['GetVersion','ListResources']: try: if not hrn: @@ -102,18 +156,22 @@ def dispatch(request, method): server_url = platform['registry'] if not Config.has_option('monitor', 'cert') : - return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json") + #return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json") + return {'error' : '-1', 'msg': 'monitor.ini has no cert configured'} cert = os.path.abspath(Config.get('monitor', 'cert')) if not os.path.isfile(cert) : - return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json") + #return HttpResponse(json.dumps({'error' : '-1'}), content_type="application/json") + return {'error' : '-1', 'msg': 'check cert file at %s'%cert} if not Config.has_option('monitor', 'pkey') : - return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json") + #return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json") + return {'error' : '-2'} pkey = os.path.abspath(Config.get('monitor', 'pkey')) if not os.path.isfile(pkey) : - return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json") + #return HttpResponse(json.dumps({'error' : '-2'}), content_type="application/json") + return {'error' : '-2'} server = SfaServerProxy(server_url, pkey, cert) @@ -122,6 +180,8 @@ def dispatch(request, method): user_config = get_user_config(user_email, pf) if 'delegated_user_credential' in user_config: user_cred = user_config['delegated_user_credential'] + elif 'user_credential' in user_config: + user_cred = user_config['user_credential'] else: user_cred = {} @@ -130,16 +190,19 @@ def dispatch(request, method): for obj_name, cred in user_config['delegated_%s_credentials'%object_type].items(): if obj_name == hrn: object_cred = cred + elif '%s_credentials'%object_type in user_config: + for obj_name, cred in user_config['%s_credentials'%object_type].items(): + if obj_name == hrn: + object_cred = cred # Both AM & Registry if method == "GetVersion": result = server.GetVersion() else: - # AM V3 + # AM API Calls if server_am: if method == "ListResources": result = server.ListResources([user_cred], api_options) - logger.debug(result.keys()) dict_result = xmltodict.parse(result['value']) result['json'] = json.dumps(dict_result) if isinstance(dict_result['rspec']['node'], list): @@ -203,18 +266,23 @@ def dispatch(request, method): #return HttpResponse(json.dumps({'error' : '-3','msg':'method not supported by AM'}), content_type="application/json") logger.debug('method %s not handled by AM' % method) result = [] + + # Registry API Calls else: record_dict = {'urn': urn, 'hrn': hrn, 'type': object_type} if method == "List": # hrn is required - result = server.List(hrn, user_cred, options) - logger.debug(result) + api_options['recursive'] = recursive + result = server.List(hrn, user_cred, api_options) + if object_type: + result = filter_records(object_type, result) elif method == "Resolve": # hrn is required # details can be True or False - options['details']=True - result = server.Resolve(hrn, user_cred, options) - logger.debug(result) + api_options['details']=True + result = server.Resolve(hrn, user_cred, api_options) + if object_type: + result = filter_records(object_type, result) elif method == "Register": # record_dict must be crafted # auth_cred must be selected in the list of auth_creds from user's account @@ -245,28 +313,9 @@ def dispatch(request, method): logger.error(traceback.format_exc()) logger.error(e) results[pf] = {'error':'-3', 'error_msg': str(e)} - if display == 'table': - return render_to_response('table-default.html', {'data' : data, 'fields' : columns, 'id' : '@component_id', 'options' : None}) - else: - results['columns'] = columns - return HttpResponse(json.dumps(results, cls=MyEncoder), content_type="application/json") -def get_user_account(user_email, platform_name): - """ - Returns the user configuration for a given platform. - This function does not resolve references. - """ - user = db.query(User).filter(User.email == user_email).one() - platform = db.query(Platform).filter(Platform.platform == platform_name).one() - accounts = [a for a in user.accounts if a.platform == platform] - if not accounts: - raise Exception, "this account does not exist" - - if accounts[0].auth_type == 'reference': - pf = json.loads(accounts[0].config)['reference_platform'] - return get_user_account(user_email, pf) - - return accounts[0] + results['columns'] = columns + return results def get_user_config(user_email, platform_name): account = get_user_account(user_email, platform_name) @@ -283,3 +332,10 @@ def get_platforms(): def get_platform_config(platform_name): platform = db.query(Platform).filter(Platform.platform == platform_name).one() return json.loads(platform.config) if platform.config else {} + +def filter_records(type, records): + filtered_records = [] + for record in records: + if (record['type'] == type) or (type == "all"): + filtered_records.append(record) + return filtered_records