Example #1
0
    def get_table_item(self,
                       table: DynamoTable,
                       key: typing.Union[str, int] = ""):
        """Retrieves dynamobdb item corresponding with primary key in the specified table.

        Input:
            table: (DynamoTable) enum
            key: (str, int) primary key in table
        Output:
            item: dynamodb item
        """

        dynamo_table = self._get_dynamo_table_resource_from_enum(table)
        try:
            table_key = {
                self._get_dynamo_table_primary_key_from_enum(table): key
            }
            item = dynamo_table.get_item(Key=table_key,
                                         ConsistentRead=True)['Item']
        except KeyError:
            raise MatrixException(status=requests.codes.not_found,
                                  title=f"Unable to find table item with key "
                                  f"{key} from DynamoDb Table {table.value}.")

        return item
    def test_run__with_one_message_in_queue_and_fails(self, mock_load_obj,
                                                      mock_transaction,
                                                      mock_complete_subtask,
                                                      mock_request_format,
                                                      mock_log_error):
        request_id = str(uuid.uuid4())
        payload = {
            'request_id': request_id,
            's3_obj_key': "test_s3_obj_key",
            'type': "test_type"
        }
        self.sqs_handler.add_message_to_queue("test_query_job_q_name", payload)
        mock_complete_subtask.side_effect = MatrixException(
            status=requests.codes.not_found, title=f"Unable to find")

        self.query_runner.run(max_loops=1)

        mock_log_error.assert_called_once()
        query_queue_messages = self.sqs_handler.receive_messages_from_queue(
            "test_query_job_q_name", 1)
        self.assertEqual(query_queue_messages, None)
        deadletter_queue_messages = self.sqs_handler.receive_messages_from_queue(
            "test_deadletter_query_job_q_name", 1)
        self.assertEqual(len(deadletter_queue_messages), 1)
        message_body = json.loads(deadletter_queue_messages[0]['Body'])
        self.assertEqual(message_body['request_id'], request_id)
        self.assertEqual(message_body['s3_obj_key'], "test_s3_obj_key")
Example #3
0
    def test_get_matrix_not_found(self, mock_get_table_item):
        request_id = str(uuid.uuid4())
        mock_get_table_item.side_effect = MatrixException(status=requests.codes.not_found, title=f"Unable to find")

        response = get_matrix(request_id)

        self.assertEqual(response[1], 404)
        self.assertTrue(request_id in response[0]['message'])
Example #4
0
    def test_get_matrix_processing__driver_not_initialized(self, mock_is_request_complete, mock_get_table_item,
                                                           mock_initialized):
        request_id = str(uuid.uuid4())
        mock_initialized.return_value = True
        mock_get_table_item.side_effect = MatrixException(status=requests.codes.not_found, title=f"Unable to find")

        response = get_matrix(request_id)

        self.assertEqual(response[1], requests.codes.ok)
        self.assertEqual(response[0]['status'], MatrixRequestStatus.IN_PROGRESS.value)
Example #5
0
 def add_message_to_queue(self, queue_url: str, payload: dict):
     response = self.sqs.meta.client.send_message(
         QueueUrl=queue_url, MessageBody=json.dumps(payload))
     status = response['ResponseMetadata']['HTTPStatusCode']
     if status != 200:
         raise MatrixException(
             status=500,
             title="Internal error",
             detail=f"Adding message for {payload} "
             f"was unsuccessful to SQS {queue_url} with status {status})")
Example #6
0
 def delete_message_from_queue(self, queue_url: str, receipt_handle: str):
     response = self.sqs.meta.client.delete_message(
         QueueUrl=queue_url, ReceiptHandle=receipt_handle)
     status = response['ResponseMetadata']['HTTPStatusCode']
     if status != 200:
         raise MatrixException(
             status=500,
             title="Internal error",
             detail=
             f"Deleting message with receipt handle {receipt_handle} from {queue_url} "
             f"was unsuccessful with status {status})")
    def _parse_from_metadatas(self, bundle_dir, bundle_manifest_path):
        protocol_id = json.load(
            open(os.path.join(bundle_dir, "analysis_protocol_0.json")))['protocol_core']['protocol_id']
        if protocol_id.startswith("smartseq2"):
            cell_lines, expression_lines = self._parse_ss2_bundle(bundle_dir, bundle_manifest_path)
        elif protocol_id.startswith("optimus"):
            cell_lines, expression_lines = self._parse_optimus_bundle(bundle_dir, bundle_manifest_path)
        elif protocol_id.startswith("cellranger"):
            cell_lines, expression_lines = self._parse_cellranger_bundle(bundle_dir, bundle_manifest_path)
        else:
            raise MatrixException(400, f"Failed to parse cell and expression metadata. "
                                       f"Unsupported analysis protocol {protocol_id}.")

        return (TableName.CELL, cell_lines, bundle_dir), (TableName.EXPRESSION, expression_lines, bundle_dir)
Example #8
0
 def receive_messages_from_queue(self,
                                 queue_url: str,
                                 wait_time=15,
                                 num_messages=1):
     response = self.sqs.meta.client.receive_message(
         QueueUrl=queue_url,
         MaxNumberOfMessages=num_messages,
         WaitTimeSeconds=wait_time)
     status = response['ResponseMetadata']['HTTPStatusCode']
     if status != 200:
         raise MatrixException(
             status=500,
             title="Internal error",
             detail=f"Retrieving message from {queue_url} "
             f"was unsuccessful with status {status})")
     return response.get('Messages')