def __init__(self, config): try: (self.kv_helper, _) = connector.open(config) except Exception as err: logger.error(f"failed to open db: {err}") sys.exit(-1) # Worker registry handler needs to be instantiated before Work order handler. Otherwise, LMDB operations don't operate on updated values. # TODO: Needs further investigation on what is causing the above behavior. self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler( self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler( self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler( self.kv_helper) self.dispatcher = Dispatcher() rpc_methods = [ self.worker_encryption_key_handler.EncryptionKeyGet, self.worker_encryption_key_handler.EncryptionKeySet, self.worker_registry_handler.WorkerLookUp, self.worker_registry_handler.WorkerLookUpNext, self.worker_registry_handler.WorkerRegister, self.worker_registry_handler.WorkerSetStatus, self.worker_registry_handler.WorkerRetrieve, self.worker_registry_handler.WorkerUpdate, self.workorder_handler.WorkOrderSubmit, self.workorder_handler.WorkOrderGetResult, ] for m in rpc_methods: self.dispatcher.add_method(m)
def __init__(self, config): if config.get('KvStorage') is None: logger.error("Kv Storage path is missing") sys.exit(-1) if config["KvStorage"].get("remote_url") is None: storage_path = TCFHOME + '/' + config['KvStorage']['StoragePath'] storage_size = config['KvStorage']['StorageSize'] self.kv_helper = KvStorage() if not self.kv_helper.open(storage_path, storage_size): logger.error("Failed to open KV Storage DB") sys.exit(-1) logger.info("employ the local LMDB") else: database_url = config["KvStorage"]["remote_url"] logger.info(f"connect to remote LMDB @{database_url}") self.kv_helper = LMDBHelperProxy(database_url) # Worker registry handler needs to be instantiated before Work order handler. Otherwise, LMDB operations don't operate on updated values. # TODO: Needs further investigation on what is causing the above behavior. self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler( self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler( self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler( self.kv_helper)
def __init__(self, config): try: (self.kv_helper, _) = connector.open(config) except Exception as err: logger.error(f"failed to open db: {err}") sys.exit(-1) # Worker registry handler needs to be instantiated before Work order handler. Otherwise, LMDB operations don't operate on updated values. # TODO: Needs further investigation on what is causing the above behavior. self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler( self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler( self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler( self.kv_helper)
def __init__(self, config): if config.get('KvStorage') is None: logger.error("Kv Storage path is missing") sys.exit(-1) storage_path = TCFHOME + '/' + config['KvStorage']['StoragePath'] self.kv_helper = KvStorage() if not self.kv_helper.open(storage_path): logger.error("Failed to open KV Storage DB") sys.exit(-1) # Worker registry handler needs to be instantiated before Work order handler. Otherwise, LMDB operations don't operate on updated values. # TODO: Needs further investigation on what is causing the above behavior. self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler(self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler(self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler(self.kv_helper)
def __init__(self, config): try: (self.kv_helper, _) = connector.open(config) except Exception as err: logger.error(f"failed to open db: {err}") sys.exit(-1) self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler( self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler( self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler( self.kv_helper) self.dispatcher = Dispatcher() rpc_methods = [ self.worker_encryption_key_handler.EncryptionKeyGet, self.worker_encryption_key_handler.EncryptionKeySet, self.worker_registry_handler.WorkerLookUp, self.worker_registry_handler.WorkerLookUpNext, self.worker_registry_handler.WorkerRegister, self.worker_registry_handler.WorkerSetStatus, self.worker_registry_handler.WorkerRetrieve, self.worker_registry_handler.WorkerUpdate, self.workorder_handler.WorkOrderSubmit, self.workorder_handler.WorkOrderGetResult, self.workorder_receipt_handler.WorkOrderReceiptCreate, self.workorder_receipt_handler.WorkOrderReceiptUpdate, self.workorder_receipt_handler.WorkOrderReceiptRetrieve, self.workorder_receipt_handler.WorkOrderReceiptUpdateRetrieve, self.workorder_receipt_handler.WorkOrderReceiptLookUp, self.workorder_receipt_handler.WorkOrderReceiptLookUpNext ] for m in rpc_methods: self.dispatcher.add_method(m)
class TCSListener(resource.Resource): """ TCSListener Class is comprised of HTTP interface which listens for the end user requests, Worker Registry Handler, Work Order Handler and Work Order Receipts Handler . """ # The isLeaf instance variable describes whether or not a resource will have children and only leaf resources get rendered. # TCSListener is the most derived class hence isLeaf is required. isLeaf = True # ----------------------------------------------------------------- def __init__(self, config): try: (self.kv_helper, _) = connector.open(config) except Exception as err: logger.error(f"failed to open db: {err}") sys.exit(-1) # Worker registry handler needs to be instantiated before Work order handler. Otherwise, LMDB operations don't operate on updated values. # TODO: Needs further investigation on what is causing the above behavior. self.worker_registry_handler = TCSWorkerRegistryHandler(self.kv_helper) self.workorder_handler = TCSWorkOrderHandler( self.kv_helper, config["Listener"]["max_work_order_count"]) self.workorder_receipt_handler = TCSWorkOrderReceiptHandler( self.kv_helper) self.worker_encryption_key_handler = WorkerEncryptionKeyHandler( self.kv_helper) def _process_request(self, input_json_str): response = {} response['error'] = {} response['error'][ 'code'] = WorkorderError.INVALID_PARAMETER_FORMAT_OR_VALUE try: input_json = json.loads(input_json_str) except: response['error'][ 'message'] = 'Error: Improper Json. Unable to load' return response if ('jsonrpc' not in input_json or 'id' not in input_json or 'method' not in input_json or 'params' not in input_json): response['error'][ 'message'] = 'Error: Json does not have the required field' return response if not isinstance(input_json['id'], int): response['error'][ 'message'] = 'Error: Id should be of type integer' return response response['jsonrpc'] = input_json['jsonrpc'] response['id'] = input_json['id'] if not isinstance(input_json['method'], str): response['error'][ 'message'] = 'Error: Method has to be of type string' return response if ((input_json['method'] == "WorkOrderSubmit") or (input_json['method'] == "WorkOrderGetResult")): return self.workorder_handler.process_work_order(input_json_str) elif ("WorkOrderReceipt" in input_json['method']): return self.workorder_receipt_handler.workorder_receipt_handler( input_json_str) elif ("Worker" in input_json['method']): return self.worker_registry_handler.worker_registry_handler( input_json_str) elif ("EncryptionKey" in input_json['method']): return self.worker_encryption_key_handler.process_encryption_key( input_json_str) else: response['error']['message'] = 'Error: Invalid method field' return response def render_GET(self, request): # JRPC response with id 0 is returned because id parameter # will not be found in GET request response = utility.create_error_response( WorkorderError.INVALID_PARAMETER_FORMAT_OR_VALUE, "0", "Only POST request is supported") logger.error( "GET request is not supported. Only POST request is supported") return response def render_POST(self, request): response = {} logger.info('Received a new request from the client') try: # process the message encoding encoding = request.getHeader('Content-Type') data = request.content.read() if encoding == 'application/json': try: input_json_str = json.loads(data.decode('utf-8')) input_json = json.loads(input_json_str) jrpc_id = input_json["id"] response = self._process_request(input_json_str) except AttributeError: logger.error("Error while loading input json") response = utility.create_error_response( WorkorderError.UNKNOWN_ERROR, jrpc_id, "UNKNOWN_ERROR: Error while loading the input JSON file" ) return response else: # JRPC response with 0 as id is returned because id can't be fecthed # from a request with unknown encoding response = utility.create_error_response( WorkorderError.UNKNOWN_ERROR, 0, "UNKNOWN_ERROR: unknown message encoding") return response except: logger.exception('exception while decoding http request %s', request.path) # JRPC response with 0 as id is returned because id can't be # fetched from improper request response = utility.create_error_response( WorkorderError.UNKNOWN_ERROR, 0, "UNKNOWN_ERROR: unable to decode incoming request") return response # send back the results try: if encoding == 'application/json': response = json.dumps(response) logger.info('response[%s]: %s', encoding, response) request.setHeader('content-type', encoding) request.setResponseCode(http.OK) return response.encode('utf8') except: logger.exception('unknown exception while processing request %s', request.path) response = utility.create_error_response( WorkorderError.UNKNOWN_ERROR, jrpc_id, "UNKNOWN_ERROR: unknown exception processing http \ request {0}".format(request.path)) return response