Skip to content

Commit 1be8e72

Browse files
committed
Polishing DRS endpoint support functions
1 parent c1a424e commit 1be8e72

File tree

2 files changed

+65
-19
lines changed

2 files changed

+65
-19
lines changed

bbconf/bbconf.py

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
DRS_ACCESS_URL,
4040
CFG_ACCESS_METHOD_KEY,
4141
)
42-
from bbconf.exceptions import MissingConfigDataError, BedBaseConfError
42+
from bbconf.exceptions import *
4343
from bbconf.helpers import raise_missing_key, get_bedbase_cfg
4444
from bbconf.models import DRSModel, AccessMethod, AccessURL
4545

@@ -566,49 +566,92 @@ def get_prefixed_uri(self, postfix: str, access_id: str) -> str:
566566
:param access_id: access method name
567567
:return: full uri path
568568
"""
569-
prefix = self.config[CFG_ACCESS_METHOD_KEY][access_id]["prefix"]
570-
return os.path.join(prefix, postfix)
569+
570+
try:
571+
prefix = self.config[CFG_ACCESS_METHOD_KEY][access_id]["prefix"]
572+
return os.path.join(prefix, postfix)
573+
except KeyError:
574+
_LOGGER.error(f"Access method {access_id} is not defined.")
575+
raise IncorrectAccessMethodError(
576+
f"Access method {access_id} is not defined."
577+
)
571578

572-
def get_object_uri(
579+
def get_thumbnail_uri(
580+
self,
573581
record_type: str,
574582
record_id: str,
575583
result_id: str,
576584
access_id: str
577585
):
586+
try:
587+
result = self.get_result(record_type, record_id, result_id)
588+
return self.get_prefixed_uri(result["thumbnail_path"], "http")
589+
except KeyError:
590+
_LOGGER.error(f"Thumbnail for {record_type} {record_id} {result_id} is not defined.")
591+
raise MissingThumbnailError(
592+
f"Thumbnail for {record_type} {record_id} {result_id} is not defined."
593+
)
594+
595+
596+
def get_result(self, record_type: str, record_id: str, result_id: str):
578597
if record_type == "bed":
579-
result = bbc.bed.retrieve_one(record_id, result_id)
598+
result = self.bed.retrieve_one(record_id, result_id)
599+
# schema = self.bed.schema.original_schema
600+
schema = self.bed.schema._sample_level_data[result_id]
580601
elif record_type == "bedset":
581-
result = bbc.bedset.retrieve_one(record_id, result_id)
602+
result = self.bedset.retrieve_one(record_id, result_id)
603+
604+
result_type = schema.get("object_type", schema["type"])
605+
_LOGGER.info(f"Getting uri for {record_type} {record_id} {result_id}")
606+
_LOGGER.info(f"Result type: {result_type}")
607+
_LOGGER.info(f"Result: {result}")
608+
return result
609+
610+
def get_object_uri(
611+
self,
612+
record_type: str,
613+
record_id: str,
614+
result_id: str,
615+
access_id: str
616+
):
617+
result = self.get_result(record_type, record_id, result_id)
582618
return self.get_prefixed_uri(result["path"], access_id)
583619

584620

585-
def get_drs_metadata(self, record_id: str, result_id: str, base_uri: str) -> DRSModel:
621+
def get_drs_metadata(self, record_type: str, record_id: str, result_id: str, base_uri: str) -> DRSModel:
586622
"""
587-
Get DRS metadata for a bed file
623+
Get DRS metadata for a bed- or bedset-associated file
588624
589-
:param object_id: record identifier
625+
:param record_type: bed or bedset
626+
:param record_id: record identifier
627+
:param result_id: name of the result file to get metadata for
628+
:param base_uri: base uri to use for the self_uri field (server hostname of DRS broker)
590629
:return: DRS metadata
591630
"""
592631

593-
bed_metadata = self.bed.retrieve_one(record_id)
632+
if record_type == "bed":
633+
record_metadata = self.bed.retrieve_one(record_id)
634+
elif record_type == "bedset":
635+
record_metadata = self.bedset.retrieve_one(record_id)
636+
_LOGGER.info(f"DRS Metadata for {record_type} {record_id} {result_id}: {record_metadata}")
594637
access_methods = []
638+
object_id = f"{record_type}.{record_id}.{result_id}"
595639
for access_id in self.config[CFG_ACCESS_METHOD_KEY].keys():
596640
access_dict = AccessMethod(
597641
type=access_id,
598642
access_id=access_id,
599-
access_url=AccessURL(url=self.get_object_uri(record_type="bed", record_id, result_id, access_id)),
643+
access_url=AccessURL(url=self.get_object_uri(record_type, record_id, result_id, access_id)),
600644
region=self.config[CFG_ACCESS_METHOD_KEY][access_id].get(
601645
"region", None
602646
),
603647
)
604648
access_methods.append(access_dict)
605-
606649
drs_dict = DRSModel(
607650
id=object_id,
608651
self_uri=f"drs://{base_uri}/{object_id}",
609-
size=bed_metadata[result_id]["size"],
610-
created_time=bed_metadata["pipestat_created_time"],
611-
updated_time=bed_metadata["pipestat_modified_time"],
652+
size=record_metadata[result_id].get("size", "unknown"),
653+
created_time=record_metadata["pipestat_created_time"],
654+
updated_time=record_metadata["pipestat_modified_time"],
612655
checksums=object_id,
613656
access_methods=access_methods,
614657
)

bbconf/exceptions.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
class BedBaseConfError(Exception):
66
"""Base exception type for this package"""
7-
87
__metaclass__ = abc.ABCMeta
98

10-
9+
class IncorrectAccessMethodError(BedBaseConfError):
10+
"""Access ID is not well defined"""
11+
pass
1112
class MissingConfigDataError(BedBaseConfError):
1213
"""Exception for invalid config file."""
1314

@@ -16,8 +17,10 @@ def __init__(self, msg):
1617
suggest = "For config format documentation please see: " + DOC_URL
1718
super(MissingConfigDataError, self).__init__(msg + spacing + suggest)
1819

19-
2020
class BedBaseConnectionError(BedBaseConfError):
2121
"""Error type for DB connection problems"""
22-
2322
pass
23+
24+
class MissingThumbnailError(BedBaseConfError):
25+
"""Error type for missing thumbnail"""
26+
pass

0 commit comments

Comments
 (0)