def computeDelete(): """Deletes a workflow. --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of the documentId to verify that the consumer has rights to download the asset. type: string - name: documentId in: query description: The ID of the asset required: true type: string - name: consumerAddress in: query description: The consumer address. required: true type: string - name: jobId in: query description: JobId. type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Invalid asset data. 500: description: Error """ data = get_request_data(request) try: body = process_compute_request(data, user_nonce) response = requests_session.delete( get_compute_endpoint(), params=body, headers={'content-type': 'application/json'}) user_nonce.increment_nonce(body['owner']) return Response(response.content, response.status_code, headers={'content-type': 'application/json'}) except BadRequestError as e: return jsonify(error=str(e)), 400 except InvalidSignatureError as e: msg = f'Consumer signature failed verification: {e}' logger.error(msg, exc_info=1) return jsonify(error=msg), 401 except (ValueError, Exception) as e: logger.error(f'Error- {str(e)}', exc_info=1) return jsonify(error=f'Error : {str(e)}'), 500
def computeStop(): """Stop the execution of a workflow. --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of (consumerAddress+jobId+documentId) to verify the consumer of this compute job/asset. The signature uses ethereum based signing method (see https://github.com/ethereum/EIPs/pull/683) type: string - name: documentId in: query description: The ID of the asset. If not provided, all currently running compute jobs will be stopped for the specified consumerAddress required: true type: string - name: consumerAddress in: query description: The consumer ethereum address. required: true type: string - name: jobId in: query description: The ID of the compute job. If not provided, all running compute jobs of the specified consumerAddress/documentId are suspended type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Consumer signature is invalid or failed verification. 500: description: General server error """ data = get_request_data(request) try: body = process_compute_request(data) response = requests_session.put( get_compute_endpoint(), params=body, headers={"content-type": "application/json"}, ) increment_nonce(body["owner"]) return Response( response.content, response.status_code, headers={"content-type": "application/json"}, ) except (ValueError, Exception) as e: logger.error(f"Error- {str(e)}", exc_info=1) return jsonify(error=f"Error : {str(e)}"), 500
def computeDelete(): """Deletes a workflow. --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of the documentId to verify that the consumer has rights to download the asset. type: string - name: documentId in: query description: The ID of the asset required: true type: string - name: consumerAddress in: query description: The consumer address. required: true type: string - name: jobId in: query description: JobId. type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Invalid asset data. 500: description: Error """ data = get_request_data(request) try: body = process_compute_request(data) response = requests_session.delete( get_compute_endpoint(), params=body, headers={"content-type": "application/json"}, ) increment_nonce(body["owner"]) return Response( response.content, response.status_code, headers={"content-type": "application/json"}, ) except (ValueError, Exception) as e: logger.error(f"Error- {str(e)}", exc_info=1) return jsonify(error=f"Error : {str(e)}"), 500
def computeStatus(): """Get status for a specific jobId/documentId/owner --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of (consumerAddress+jobId+documentId) to verify the consumer of this asset/compute job. The signature uses ethereum based signing method (see https://github.com/ethereum/EIPs/pull/683) type: string - name: documentId in: query description: The ID of the asset. If not provided, the status of all currently running and old compute jobs for the specified consumerAddress will be returned. required: true type: string - name: consumerAddress in: query description: The consumer ethereum address. required: true type: string - name: jobId in: query description: The ID of the compute job. If not provided, all running compute jobs of the specified consumerAddress/documentId are suspended type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Consumer signature is invalid or failed verification. 500: description: General server error """ data = get_request_data(request) try: signed_request = False try: body = process_compute_request(data, user_nonce) signed_request = True except Exception: body = process_compute_request(data, user_nonce, require_signature=False) response = requests_session.get( get_compute_endpoint(), params=body, headers={'content-type': 'application/json'}) user_nonce.increment_nonce(body['owner']) _response = response.content # Filter status info if signature is not given or failed validation if not signed_request: resp_content = json.loads(response.content.decode('utf-8')) if not isinstance(resp_content, list): resp_content = [resp_content] _response = [] keys_to_filter = [ 'resultsUrl', 'algorithmLogUrl', 'resultsDid', 'owner', ] for job_info in resp_content: for k in keys_to_filter: job_info.pop(k) _response.append(job_info) _response = json.dumps(_response) return Response(_response, response.status_code, headers={'content-type': 'application/json'}) except BadRequestError as e: return jsonify(error=str(e)), 400 except InvalidSignatureError as e: msg = f'Consumer signature failed verification: {e}' logger.error(msg, exc_info=1) return jsonify(error=msg), 401 except (ValueError, Exception) as e: logger.error(f'Error- {str(e)}', exc_info=1) return jsonify(error=f'Error : {str(e)}'), 500
def compute_get_status_job(): """Get status for a specific jobId/documentId/owner --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of (consumerAddress+jobId+documentId) to verify the consumer of this asset/compute job. The signature uses ethereum based signing method (see https://github.com/ethereum/EIPs/pull/683) type: string - name: documentId in: query description: The ID of the asset. If not provided, the status of all currently running and old compute jobs for the specified consumerAddress will be returned. required: true type: string - name: consumerAddress in: query description: The consumer ethereum address. required: true type: string - name: jobId in: query description: The ID of the compute job. If not provided, all running compute jobs of the specified consumerAddress/documentId are suspended type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Consumer signature is invalid or failed verification. 500: description: General server error """ data = get_request_data(request) try: body = process_compute_request(data, user_nonce) response = requests_session.get( get_compute_endpoint(), params=body, headers={'content-type': 'application/json'}) user_nonce.increment_nonce(body['owner']) return Response( response.content, response.status_code, headers={'content-type': 'application/json'} ) except BadRequestError as e: return jsonify(error=e), 400 except InvalidSignatureError as e: msg = f'Consumer signature failed verification: {e}' logger.error(msg, exc_info=1) return jsonify(error=msg), 401 except (ValueError, Exception) as e: logger.error(f'Error- {str(e)}', exc_info=1) return jsonify(error=f'Error : {str(e)}'), 500
def computeStatus(): """Get status for a specific jobId/documentId/owner --- tags: - services consumes: - application/json parameters: - name: signature in: query description: Signature of (consumerAddress+jobId+documentId) to verify the consumer of this asset/compute job. The signature uses ethereum based signing method (see https://github.com/ethereum/EIPs/pull/683) type: string - name: documentId in: query description: The ID of the asset. If not provided, the status of all currently running and old compute jobs for the specified consumerAddress will be returned. required: true type: string - name: consumerAddress in: query description: The consumer ethereum address. required: true type: string - name: jobId in: query description: The ID of the compute job. If not provided, all running compute jobs of the specified consumerAddress/documentId are suspended type: string responses: 200: description: Call to the operator-service was successful. 400: description: One of the required attributes is missing. 401: description: Consumer signature is invalid or failed verification. 500: description: General server error """ data = get_request_data(request) try: body = process_compute_request(data) response = requests_session.get( get_compute_endpoint(), params=body, headers={"content-type": "application/json"}, ) _response = response.content signed_request = bool(data.get("signature")) if signed_request: owner = data.get("consumerAddress") did = data.get("documentId") jobId = data.get("jobId") original_msg = f"{owner}{jobId}{did}" try: verify_signature( owner, data.get("signature"), original_msg, get_nonce(owner) ) except InvalidSignatureError: signed_request = False increment_nonce(owner) # Filter status info if signature is not given or failed validation if not signed_request: resp_content = json.loads(response.content.decode("utf-8")) if not isinstance(resp_content, list): resp_content = [resp_content] _response = [] keys_to_filter = ["resultsUrl", "algorithmLogUrl", "resultsDid", "owner"] for job_info in resp_content: for k in keys_to_filter: job_info.pop(k) _response.append(job_info) _response = json.dumps(_response) return Response( _response, response.status_code, headers={"content-type": "application/json"}, ) except (ValueError, Exception) as e: logger.error(f"Error- {str(e)}", exc_info=1) return jsonify(error=f"Error : {str(e)}"), 500