File indexing completed on 2026-04-09 07:58:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
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