Beispiel #1
0
 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'
Beispiel #2
0
    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)
Beispiel #3
0
    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'
Beispiel #4
0
    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)