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