def generate(issuer, vo): for result in request.list_requests(src_rses, dst_rses, states, issuer=issuer, vo=vo): del result['_sa_instance_state'] yield render_json(**result) + '\n'
def test_api_request(self): """ REQUEST (API): Test external representation of requests """ did = generate_uuid() add_did(self.scope_name, did, 'dataset', issuer='root', account=self.account_name, rse=self.rse_name, **self.vo) requests = [{ 'dest_rse_id': self.rse2_id, 'source_rse_id': self.rse_id, 'request_type': constants.RequestType.TRANSFER, 'request_id': generate_uuid(), 'name': did, 'scope': self.scope_name, 'account': self.account_name, 'rule_id': generate_uuid(), 'retry_count': 1, 'requested_at': datetime.now(), 'attributes': { 'activity': 'User Subscription', 'bytes': 10, 'md5': '', 'adler32': '' } }] reqs = queue_requests(requests, issuer='root', **self.vo) # this does not pass in the source rse reqs = list(reqs) assert_not_equal(0, len(reqs)) for r in reqs: assert_equal(r['scope'], self.scope_name) assert_equal(r['account'], self.account_name) assert_equal(r['source_rse'], self.rse_name) assert_equal(r['dest_rse'], self.rse2_name) out = get_request_by_did(self.scope_name, did, self.rse2_name, issuer='root', **self.vo) assert_equal(out['scope'], self.scope_name) assert_equal(out['account'], self.account_name) assert_equal(out['dest_rse'], self.rse2_name) assert_equal(out['source_rse'], self.rse_name) out = list_requests([self.rse_name], [self.rse2_name], [constants.RequestState.QUEUED], issuer='root', **self.vo) out = list(out) assert_not_equal(0, len(out)) assert_in(self.scope_name, [req['scope'] for req in out]) for req in out: if req['scope'] == self.scope_name: assert_equal(req['scope'], self.scope_name) assert_equal(req['account'], self.account_name) assert_equal(req['dest_rse'], self.rse2_name) assert_equal(req['source_rse'], self.rse_name)
def GET(self): """ List requests for a given source and destination RSE or site. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Request Not Found 406 Not Acceptable """ header('Content-Type', 'application/x-json-stream') params = parse_qs(ctx.query[1:]) src_rse = params.get('src_rse', [None])[0] dst_rse = params.get('dst_rse', [None])[0] src_site = params.get('src_site', [None])[0] dst_site = params.get('dst_site', [None])[0] request_states = params.get('request_states', [None])[0] if not request_states: raise generate_http_error(400, 'MissingParameter', 'Request state is missing') if src_rse and not dst_rse: raise generate_http_error(400, 'MissingParameter', 'Destination RSE is missing') elif dst_rse and not src_rse: raise generate_http_error(400, 'MissingParameter', 'Source RSE is missing') elif src_site and not dst_site: raise generate_http_error(400, 'MissingParameter', 'Destination site is missing') elif dst_site and not src_site: raise generate_http_error(400, 'MissingParameter', 'Source site is missing') try: states = [ RequestState.from_string(state) for state in request_states.split(',') ] except ValueError: raise generate_http_error(400, 'Invalid', 'Request state value is invalid') src_rses = [] dst_rses = [] if src_site: src_rses = get_rses_with_attribute_value(key='site', value=src_site, lookup_key='site', vo=ctx.env.get('vo')) if not src_rses: raise generate_http_error( 404, 'NotFound', 'Could not resolve site name %s to RSE' % src_site) src_rses = [get_rse_name(rse['rse_id']) for rse in src_rses] dst_rses = get_rses_with_attribute_value(key='site', value=dst_site, lookup_key='site', vo=ctx.env.get('vo')) if not dst_rses: raise generate_http_error( 404, 'NotFound', 'Could not resolve site name %s to RSE' % dst_site) dst_rses = [get_rse_name(rse['rse_id']) for rse in dst_rses] else: dst_rses = [dst_rse] src_rses = [src_rse] for result in request.list_requests(src_rses, dst_rses, states, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')): del result['_sa_instance_state'] yield render_json(**result) + '\n'
def get(self): """ List requests for a given source and destination RSE or site. .. :quickref: RequestsGet; list requests :reqheader Content-Type: application/x-json-stream :status 200: Request found. :status 404: Request not found. :status 406: Not Acceptable. """ src_rse = f_request.get('src_rse') dst_rse = f_request.get('dst_rse') src_site = f_request.get('src_site') dst_site = f_request.get('dst_site') request_states = f_request.get('request_states') if not request_states: return generate_http_error_flask(400, 'MissingParameter', 'Request state is missing') if src_rse and not dst_rse: return generate_http_error_flask(400, 'MissingParameter', 'Destination RSE is missing') elif dst_rse and not src_rse: return generate_http_error_flask(400, 'MissingParameter', 'Source RSE is missing') elif src_site and not dst_site: return generate_http_error_flask(400, 'MissingParameter', 'Destination site is missing') elif dst_site and not src_site: return generate_http_error_flask(400, 'MissingParameter', 'Source site is missing') try: states = [ RequestState.from_string(state) for state in request_states.split(',') ] except ValueError: return generate_http_error_flask(400, 'Invalid', 'Request state value is invalid') src_rses = [] dst_rses = [] if src_site: src_rses = get_rses_with_attribute_value(key='site', value=src_site, lookup_key='site') if not src_rses: return generate_http_error_flask( 404, 'NotFound', 'Could not resolve site name %s to RSE' % src_site) src_rses = [get_rse_name(rse['rse_id']) for rse in src_rses] dst_rses = get_rses_with_attribute_value(key='site', value=dst_site, lookup_key='site') if not dst_rses: return generate_http_error_flask( 404, 'NotFound', 'Could not resolve site name %s to RSE' % dst_site) dst_rses = [get_rse_name(rse['rse_id']) for rse in dst_rses] else: dst_rses = [dst_rse] src_rses = [src_rse] results = [] for result in request.list_requests( src_rses, dst_rses, states, issuer=f_request.environ.get('issuer')): result = result.to_dict() del result['_sa_instance_state'] results.append(result) return json.dumps(results, cls=APIEncoder)