Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:58:21

0001 #!/usr/bin/env python
0002 #
0003 # Licensed under the Apache License, Version 2.0 (the "License");
0004 # You may not use this file except in compliance with the License.
0005 # You may obtain a copy of the License at
0006 # http://www.apache.org/licenses/LICENSE-2.0OA
0007 #
0008 # Authors:
0009 # - Wen Guan, <wen.guan@cern.ch>, 2024 - 2025
0010 
0011 
0012 from traceback import format_exc
0013 
0014 from flask import Blueprint
0015 
0016 from idds.common import exceptions
0017 from idds.common.authentication import authenticate_is_super_user
0018 from idds.common.constants import HTTP_STATUS_CODE
0019 from idds.common.constants import RequestStatus, RequestType
0020 from idds.common.utils import json_loads
0021 from idds.core.requests import get_request
0022 from idds.core.transforms import add_transform, get_transform, get_transforms
0023 from idds.rest.v1.controller import IDDSController
0024 
0025 
0026 class Transform(IDDSController):
0027     """ Create a Transform. """
0028 
0029     def post(self, request_id):
0030         """ Create Transform.
0031         HTTP Success:
0032             200 OK
0033         HTTP Error:
0034             400 Bad request
0035             500 Internal Error
0036         """
0037         try:
0038             logger = self.get_logger()
0039             parameters = self.get_request().data and json_loads(self.get_request().data)
0040             if 'status' not in parameters:
0041                 parameters['status'] = RequestStatus.New
0042             if 'priority' not in parameters or not parameters['priority']:
0043                 parameters['priority'] = 0
0044             if 'token' not in parameters or not parameters['token']:
0045                 return self.generate_http_response(HTTP_STATUS_CODE.BadRequest, exc_cls=exceptions.BadRequest.__name__, exc_msg='Token is required')
0046             token = parameters['token']
0047             del parameters['token']
0048         except ValueError:
0049             return self.generate_http_response(HTTP_STATUS_CODE.BadRequest, exc_cls=exceptions.BadRequest.__name__, exc_msg='Cannot decode json parameter dictionary')
0050 
0051         try:
0052             if not request_id or request_id in [None, 'None', 'none', 'NULL', 'null']:
0053                 raise exceptions.IDDSException("Request (request_id: %s) is required" % request_id)
0054 
0055             request_id = int(request_id)
0056             req = get_request(request_id=request_id)
0057             if not req:
0058                 raise exceptions.IDDSException("Request %s is not found" % request_id)
0059 
0060             if req['request_type'] not in [RequestType.iWorkflow, RequestType.iWorkflowLocal]:
0061                 raise exceptions.IDDSException("Request type %s doesn't support this operations" % req['request_type'])
0062 
0063             workflow = req['request_metadata']['workflow']
0064             if workflow.token != token:
0065                 raise exceptions.IDDSException("Token %s is not correct for request %s" % (token, request_id))
0066 
0067             username = self.get_username()
0068             if req['username'] and req['username'] != username and not authenticate_is_super_user(username):
0069                 raise exceptions.AuthenticationNoPermission("User %s has no permission to update request %s" % (username, request_id))
0070 
0071             parameters['request_id'] = request_id
0072             transform_id = add_transform(**parameters)
0073         except exceptions.DuplicatedObject as error:
0074             return self.generate_http_response(HTTP_STATUS_CODE.Conflict, exc_cls=error.__class__.__name__, exc_msg=error)
0075         except exceptions.IDDSException as error:
0076             return self.generate_http_response(HTTP_STATUS_CODE.InternalError, exc_cls=error.__class__.__name__, exc_msg=error)
0077         except Exception as error:
0078             logger.error(error)
0079             logger.error(format_exc())
0080             return self.generate_http_response(HTTP_STATUS_CODE.InternalError, exc_cls=exceptions.CoreException.__name__, exc_msg=error)
0081 
0082         return self.generate_http_response(HTTP_STATUS_CODE.OK, data={'transform_id': transform_id})
0083 
0084     def get(self, request_id, transform_id=None):
0085         """ Get transforms with given id.
0086         HTTP Success:
0087             200 OK
0088         HTTP Error:
0089             404 Not Found
0090             500 InternalError
0091         :returns: dictionary of an request.
0092         """
0093 
0094         try:
0095             if not request_id or request_id in [None, 'None', 'none', 'NULL', 'null']:
0096                 raise exceptions.IDDSException("Request (request_id: %s) is required" % request_id)
0097             if not transform_id or transform_id in [None, 'None', 'none', 'NULL', 'null']:
0098                 transform_id = None
0099 
0100             if not transform_id:
0101                 tfs = get_transforms(request_id=request_id)
0102             else:
0103                 tfs = get_transform(request_id=request_id, transform_id=transform_id)
0104         except exceptions.IDDSException as error:
0105             return self.generate_http_response(HTTP_STATUS_CODE.InternalError, exc_cls=error.__class__.__name__, exc_msg=error)
0106         except Exception as error:
0107             print(error)
0108             print(format_exc())
0109             return self.generate_http_response(HTTP_STATUS_CODE.InternalError, exc_cls=exceptions.CoreException.__name__, exc_msg=error)
0110 
0111         return self.generate_http_response(HTTP_STATUS_CODE.OK, data=tfs)
0112 
0113 
0114 """----------------------
0115    Web service url maps
0116 ----------------------"""
0117 
0118 
0119 def get_blueprint():
0120     bp = Blueprint('transfrom', __name__)
0121 
0122     transform_view = Transform.as_view('transform')
0123     bp.add_url_rule('/transform/<request_id>', view_func=transform_view, methods=['post', ])
0124     bp.add_url_rule('/transform/<request_id>', view_func=transform_view, methods=['get', ])
0125     bp.add_url_rule('/transform/<request_id>/<transform_id>', view_func=transform_view, methods=['get', ])
0126 
0127     return bp