Skip to content

Commit eb37d04

Browse files
authored
Return href information for h5path requests (HDFGroup#235)
Specifically, this is useful for H5Ovisit in the REST VOL. Also fix getObjectIdByPath not passing the values of `follow_soft_links` and `follow_external_links` to recursive calls
1 parent 7f342a5 commit eb37d04

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

hsds/domain_sn.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,35 @@ async def GET_Domain(request):
806806

807807
# client may not know class of object retrieved via path
808808
obj_json["class"] = getObjectClass(obj_id)
809-
# Not bothering with hrefs for h5path lookups...
809+
810+
hrefs = []
811+
hrefs.append({"rel": "self", "href": getHref(request, "/")})
812+
if "root" in domain_json:
813+
root_uuid = domain_json["root"]
814+
href = getHref(request, "/datasets")
815+
hrefs.append({"rel": "database", "href": href})
816+
href = getHref(request, "/groups")
817+
hrefs.append({"rel": "groupbase", "href": href})
818+
href = getHref(request, "/datatypes")
819+
hrefs.append({"rel": "typebase", "href": href})
820+
href = getHref(request, "/groups/" + root_uuid)
821+
hrefs.append({"rel": "root", "href": href})
822+
href = getHref(request, "/")
823+
hrefs.append({"rel": "home", "href": href})
824+
825+
hrefs.append({"rel": "acls", "href": getHref(request, "/acls")})
826+
parent_domain = getParentDomain(domain)
827+
if not parent_domain or getPathForDomain(parent_domain) == "/":
828+
is_toplevel = True
829+
else:
830+
is_toplevel = False
831+
log.debug(f"href parent domain: {parent_domain}")
832+
if not is_toplevel:
833+
href = getHref(request, "/", domain=parent_domain)
834+
hrefs.append({"rel": "parent", "href": href})
835+
836+
obj_json["hrefs"] = hrefs
837+
810838
resp = await jsonResponse(request, obj_json)
811839
log.response(request, resp=resp)
812840
return resp

hsds/servicenode_lib.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,9 @@ async def getObjectIdByPath(app, obj_id, h5path, bucket=None, refresh=False, dom
285285
log.debug(msg)
286286
obj_id, domain, link_json = await getObjectIdByPath(
287287
app, ext_domain_json["root"], link_json["h5path"],
288-
bucket=bucket, refresh=refresh, domain=domain)
288+
bucket=bucket, refresh=refresh, domain=domain,
289+
follow_soft_links=follow_soft_links,
290+
follow_external_links=follow_external_links)
289291
else:
290292
msg = "Cannot follow external link by relative path"
291293
log.warn(msg)
@@ -303,7 +305,9 @@ async def getObjectIdByPath(app, obj_id, h5path, bucket=None, refresh=False, dom
303305
# If relative path, keep parent object the same
304306
obj_id, domain, link_json = await getObjectIdByPath(
305307
app, obj_id, path_from_link, bucket=bucket,
306-
refresh=refresh, domain=domain)
308+
refresh=refresh, domain=domain,
309+
follow_soft_links=follow_soft_links,
310+
follow_external_links=follow_external_links)
307311
else:
308312
if not domain:
309313
msg = "Soft link with absolute path used with no domain given"
@@ -316,7 +320,9 @@ async def getObjectIdByPath(app, obj_id, h5path, bucket=None, refresh=False, dom
316320

317321
obj_id, domain, link_json = await getObjectIdByPath(
318322
app, domain_json["root"], path_from_link,
319-
bucket=bucket, refresh=refresh, domain=domain)
323+
bucket=bucket, refresh=refresh, domain=domain,
324+
follow_soft_links=follow_soft_links,
325+
follow_external_links=follow_external_links)
320326

321327
elif link_json["class"] == "H5L_TYPE_HARD":
322328
obj_id = link_json["id"]
@@ -356,7 +362,9 @@ async def getObjectIdByPath(app, obj_id, h5path, bucket=None, refresh=False, dom
356362

357363
obj_id, domain, link_json = await getObjectIdByPath(
358364
app, parent_id, link_json["h5path"],
359-
bucket=bucket, refresh=refresh, domain=domain)
365+
bucket=bucket, refresh=refresh, domain=domain,
366+
follow_soft_links=follow_soft_links,
367+
follow_external_links=follow_external_links)
360368

361369
return obj_id, domain, link_json
362370

0 commit comments

Comments
 (0)