Skip to content
Draft
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
978e672
add h5json package
jreadey Apr 14, 2025
abb5d0c
temp use of github branch for h5json ref
jreadey Apr 14, 2025
ed44afa
remove array_util test
jreadey Apr 14, 2025
bdff6e4
use h5json for ndarray_compare function
jreadey Apr 14, 2025
3904cf9
use h5json objid funcs
jreadey Apr 23, 2025
e1926c0
add nodeUtil.py
jreadey Apr 23, 2025
ae4579f
fix parameter for createObjId call
jreadey Apr 23, 2025
d6cad74
fix collection name for use with h5json
jreadey Apr 23, 2025
6add48a
use connsistent collection name for isValidUuid
jreadey Apr 23, 2025
b13321c
fix flake8 format errors
jreadey Apr 23, 2025
fee9390
fix flake8 error in testall
jreadey Apr 23, 2025
f1b1cab
use h5json for unit test id
jreadey Apr 23, 2025
5dc3f76
restrict version on numcodecs
jreadey Apr 24, 2025
fb17e10
allow client to generate obj ids
jreadey Apr 30, 2025
3be18a0
enable attributes to be included with POST req
jreadey May 7, 2025
00d7c96
add create timestamps for attributes in obj create
jreadey May 7, 2025
47b9a6e
enable links to be initialized in post groups
jreadey May 7, 2025
d9c3e87
support dataset value init in post request
jreadey May 8, 2025
4ab24fc
add compound init value test
jreadey May 9, 2025
fc3ad68
added post data with compound data initializer
jreadey May 9, 2025
8a18945
add post_crawler class
jreadey May 15, 2025
a8ec66d
avoid exception for mkdir race condition
jreadey May 15, 2025
41e23e9
use domain crawler to create links for post group multi
jreadey May 15, 2025
7cfa3d6
added multi create for datatype objs
jreadey May 16, 2025
ef746d0
added datatype test with no type in body
jreadey May 18, 2025
b1af9bc
modularize dataset creation args processing
jreadey May 20, 2025
52f42f3
refacotr post dataset args to service_lib.py
jreadey May 21, 2025
ce45804
add multi-dataset test with init data
jreadey May 21, 2025
88e0691
allow client group id for PUT domain
jreadey Jun 6, 2025
7561534
fix np.frombuffer error
jreadey Jun 8, 2025
25c4cf3
fix dsetUtil flake errors
jreadey Jun 8, 2025
5cc77e7
expanded link test
jreadey Jul 14, 2025
45f3aa5
added config to test high latency storage
jreadey Jul 16, 2025
ff1c043
added put_data action for DomainCrawler
jreadey Jul 22, 2025
cda56cf
fix for hang in DomainCrawler put_data handler
jreadey Jul 23, 2025
5a2d4d6
reduce log verbosity
jreadey Jul 23, 2025
053395c
fix for regression with h5pyd master branch
jreadey Jul 29, 2025
78127f1
enable client-based timestamps for attribute and link creation
jreadey Sep 8, 2025
f96b34c
remove python 3.9 from .git workflow
jreadey Sep 9, 2025
03e413f
adjust min time for time skew test
jreadey Sep 9, 2025
b6016e0
use hdf5-json util classes
jreadey Oct 29, 2025
61d38fd
update requirement.txt
jreadey Nov 13, 2025
73d8223
updates to support h5json latest
joshStillerman Dec 16, 2025
a2ca1ee
updated for new hdf5-json methods
jreadey Dec 26, 2025
55c8598
update for h5json changes
jreadey Jan 4, 2026
77042d8
added consolidated metadata support
jreadey Jan 6, 2026
23bb24b
fix for use of H5S_UNLIMITED in maxdims
jreadey Jan 6, 2026
c66d632
fix for domain_test
jreadey Jan 6, 2026
6917c5d
refactor linkUtil with h5json
jreadey Jan 8, 2026
99fda2d
fix for attr uninit values
jreadey Feb 3, 2026
2bafb51
check for zero-length domain name
jreadey Feb 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions hsds/async_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
from aiohttp.client_exceptions import ClientError
from aiohttp.web_exceptions import HTTPNotFound, HTTPInternalServerError
from aiohttp.web_exceptions import HTTPForbidden
from .util.idUtil import isValidUuid, isSchema2Id, getS3Key, isS3ObjKey
from .util.idUtil import getObjId, isValidChunkId, getCollectionForId
from h5json.hdf5dtype import getItemSize
from h5json.hdf5dtype import createDataType
from h5json.array_util import getNumElements, bytesToArray
from h5json.objid import isValidUuid, isSchema2Id, getS3Key, isS3ObjKey
from h5json.objid import getObjId, isValidChunkId, getCollectionForId

from .util.chunkUtil import getDatasetId, getNumChunks, ChunkIterator
from .util.hdf5dtype import getItemSize, createDataType
from .util.arrayUtil import getNumElements, bytesToArray
from .util.dsetUtil import getHyperslabSelection, getFilterOps, getChunkDims, getFilters
from .util.dsetUtil import getDatasetLayoutClass, getDatasetLayout, getShapeDims
from .util.storUtil import getStorKeys, putStorJSONObj, getStorJSONObj
Expand Down
7 changes: 4 additions & 3 deletions hsds/attr_dn.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web import json_response

from h5json.hdf5dtype import getItemSize, createDataType
from h5json.array_util import arrayToBytes, jsonToArray, decodeData
from h5json.array_util import bytesToArray, bytesArrayToList, getNumElements

from .util.attrUtil import validateAttributeName, isEqualAttr
from .util.hdf5dtype import getItemSize, createDataType
from .util.globparser import globmatch
from .util.dsetUtil import getShapeDims
from .util.arrayUtil import arrayToBytes, jsonToArray, decodeData
from .util.arrayUtil import bytesToArray, bytesArrayToList, getNumElements
from .util.domainUtil import isValidBucketName
from .datanode_lib import get_obj_id, get_metadata_obj, save_metadata_obj
from . import hsds_logger as log
Expand Down
11 changes: 6 additions & 5 deletions hsds/attr_sn.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@
from aiohttp.web import StreamResponse
from json import JSONDecodeError

from h5json.hdf5dtype import validateTypeItem, getBaseTypeJson
from h5json.hdf5dtype import createDataType, getItemSize
from h5json.array_util import jsonToArray, getNumElements, bytesArrayToList
from h5json.array_util import bytesToArray, arrayToBytes, decodeData, encodeData
from h5json.objid import isValidUuid, getRootObjId

from .util.httpUtil import getAcceptType, jsonResponse, getHref, getBooleanParam
from .util.globparser import globmatch
from .util.idUtil import isValidUuid, getRootObjId
from .util.authUtil import getUserPasswordFromRequest, validateUserPassword
from .util.domainUtil import getDomainFromRequest, isValidDomain
from .util.domainUtil import getBucketForDomain, verifyRoot
from .util.attrUtil import validateAttributeName, getRequestCollectionName
from .util.hdf5dtype import validateTypeItem, getBaseTypeJson
from .util.hdf5dtype import createDataType, getItemSize
from .util.arrayUtil import jsonToArray, getNumElements, bytesArrayToList
from .util.arrayUtil import bytesToArray, arrayToBytes, decodeData, encodeData
from .util.dsetUtil import getShapeDims

from .servicenode_lib import getDomainJson, getObjectJson, validateAction
Expand Down
6 changes: 4 additions & 2 deletions hsds/basenode.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,17 @@
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web_exceptions import HTTPServiceUnavailable


from . import config
from .util.httpUtil import http_get, http_post, jsonResponse
from .util.idUtil import createNodeId, getNodeNumber, getNodeCount
from .util.authUtil import getUserPasswordFromRequest, validateUserPassword
from .util.authUtil import isAdminUser
from .util.k8sClient import getDnLabelSelector, getPodIps
from .util.nodeUtil import createNodeId, getNodeNumber, getNodeCount

from . import hsds_logger as log

HSDS_VERSION = "0.9.2"
HSDS_VERSION = "1.0.0"


def getVersion():
Expand Down
9 changes: 5 additions & 4 deletions hsds/chunk_crawl.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.client_exceptions import ClientError

from h5json.hdf5dtype import createDataType
from h5json.array_util import jsonToArray, getNumpyValue
from h5json.array_util import getNumElements, arrayToBytes, bytesToArray

from .util.nodeUtil import getDataNodeUrl, getNodeCount
from .util.httpUtil import http_get, http_put, http_post, get_http_client
from .util.httpUtil import isUnixDomainUrl
from .util.idUtil import getDataNodeUrl, getNodeCount
from .util.hdf5dtype import createDataType
from .util.dsetUtil import getSliceQueryParam, getShapeDims
from .util.dsetUtil import getSelectionShape, getChunkLayout
from .util.chunkUtil import getChunkCoverage, getDataCoverage
from .util.chunkUtil import getChunkIdForPartition, getQueryDtype
from .util.arrayUtil import jsonToArray, getNumpyValue
from .util.arrayUtil import getNumElements, arrayToBytes, bytesToArray

from . import config
from . import hsds_logger as log
Expand Down
8 changes: 5 additions & 3 deletions hsds/chunk_dn.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,20 @@
from aiohttp.web_exceptions import HTTPNotFound, HTTPServiceUnavailable
from aiohttp.web import json_response, StreamResponse

from h5json.hdf5dtype import createDataType, getSubType
from h5json.array_util import bytesToArray, arrayToBytes, getBroadcastShape
from h5json.objid import getS3Key, isValidUuid

from .util.httpUtil import request_read, getContentType
from .util.arrayUtil import bytesToArray, arrayToBytes, getBroadcastShape
from .util.idUtil import getS3Key, validateInPartition, isValidUuid
from .util.storUtil import isStorObj, deleteStorObj
from .util.hdf5dtype import createDataType, getSubType
from .util.dsetUtil import getSelectionList, getChunkLayout, getShapeDims
from .util.dsetUtil import getSelectionShape, getChunkInitializer
from .util.chunkUtil import getChunkIndex, getDatasetId, chunkQuery
from .util.chunkUtil import chunkWriteSelection, chunkReadSelection
from .util.chunkUtil import chunkWritePoints, chunkReadPoints
from .util.domainUtil import isValidBucketName
from .util.boolparser import BooleanParser
from .util.nodeUtil import validateInPartition
from .datanode_lib import get_metadata_obj, get_chunk, save_chunk

from . import hsds_logger as log
Expand Down
10 changes: 5 additions & 5 deletions hsds/chunk_sn.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@
from aiohttp.web_exceptions import HTTPConflict, HTTPInternalServerError
from aiohttp.web import StreamResponse

from h5json.hdf5dtype import getItemSize, getDtypeItemSize, getSubType, createDataType
from h5json.array_util import bytesArrayToList, jsonToArray, getNumElements, arrayToBytes
from h5json.array_util import bytesToArray, squeezeArray, getBroadcastShape
from h5json.objid import isValidUuid

from .util.httpUtil import getHref, getAcceptType, getContentType
from .util.httpUtil import request_read, jsonResponse, isAWSLambda
from .util.idUtil import isValidUuid
from .util.domainUtil import getDomainFromRequest, isValidDomain
from .util.domainUtil import getBucketForDomain
from .util.hdf5dtype import getItemSize, getDtypeItemSize, getSubType, createDataType
from .util.dsetUtil import isNullSpace, isScalarSpace, get_slices, getShapeDims
from .util.dsetUtil import isExtensible, getSelectionPagination
from .util.dsetUtil import getSelectionShape, getDsetMaxDims, getChunkLayout
from .util.chunkUtil import getNumChunks, getChunkIds, getChunkId
from .util.arrayUtil import bytesArrayToList, jsonToArray
from .util.arrayUtil import getNumElements, arrayToBytes, bytesToArray
from .util.arrayUtil import squeezeArray, getBroadcastShape
from .util.authUtil import getUserPasswordFromRequest, validateUserPassword
from .servicenode_lib import getDsetJson, validateAction
from .dset_lib import getSelectionData, getParser, extendShape
Expand Down
4 changes: 3 additions & 1 deletion hsds/chunklocator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import numpy as np
from . import config
from . import hsds_logger as log
from .util.arrayUtil import bytesArrayToList, getNumElements

from h5json.array_util import bytesArrayToList, getNumElements

from .util.dsetUtil import getSelectionList, getSelectionShape


Expand Down
7 changes: 4 additions & 3 deletions hsds/ctype_dn.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web import json_response

from .util.idUtil import isValidUuid, validateUuid
from h5json.objid import isValidUuid, validateUuid

from .datanode_lib import get_obj_id, get_metadata_obj, save_metadata_obj
from .datanode_lib import delete_metadata_obj, check_metadata_obj
from .util.domainUtil import isValidBucketName
Expand All @@ -33,7 +34,7 @@ async def GET_Datatype(request):
params = request.rel_url.query
ctype_id = get_obj_id(request)

if not isValidUuid(ctype_id, obj_class="type"):
if not isValidUuid(ctype_id, obj_class="datatypes"):
log.error(f"Unexpected type_id: {ctype_id}")
raise HTTPInternalServerError()

Expand Down Expand Up @@ -90,7 +91,7 @@ async def POST_Datatype(request):
raise HTTPBadRequest(reason=msg)

ctype_id = get_obj_id(request, body=body)
if not isValidUuid(ctype_id, obj_class="datatype"):
if not isValidUuid(ctype_id, obj_class="datatypes"):
log.error("Unexpected type_id: {ctype_id}")
raise HTTPInternalServerError()

Expand Down
14 changes: 8 additions & 6 deletions hsds/ctype_sn.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,17 @@

from aiohttp.web_exceptions import HTTPBadRequest, HTTPGone
from json import JSONDecodeError

from h5json.hdf5dtype import validateTypeItem, getBaseTypeJson
from h5json.objid import isValidUuid

from .util.httpUtil import getHref, respJsonAssemble, getBooleanParam
from .util.httpUtil import jsonResponse
from .util.idUtil import isValidUuid
from .util.linkUtil import validateLinkName
from .util.authUtil import getUserPasswordFromRequest, aclCheck
from .util.authUtil import validateUserPassword
from .util.domainUtil import getDomainFromRequest, getPathForDomain, isValidDomain
from .util.domainUtil import getBucketForDomain, verifyRoot
from .util.hdf5dtype import validateTypeItem, getBaseTypeJson
from .servicenode_lib import getDomainJson, getObjectJson, validateAction
from .servicenode_lib import getObjectIdByPath, getPathForObjectId
from .servicenode_lib import createObject, createObjectByPath, deleteObject
Expand All @@ -49,7 +51,7 @@ async def GET_Datatype(request):
include_attrs = True

if ctype_id:
if not isValidUuid(ctype_id, "Type"):
if not isValidUuid(ctype_id, "datatypes"):
msg = f"Invalid type id: {ctype_id}"
log.warn(msg)
raise HTTPBadRequest(reason=msg)
Expand All @@ -60,7 +62,7 @@ async def GET_Datatype(request):
group_id = None
if "grpid" in params:
group_id = params["grpid"]
if not isValidUuid(group_id, "Group"):
if not isValidUuid(group_id, "groups"):
msg = f"Invalid parent group id: {group_id}"
log.warn(msg)
raise HTTPBadRequest(reason=msg)
Expand Down Expand Up @@ -101,7 +103,7 @@ async def GET_Datatype(request):
# throws 404 if not found
kwargs = {"bucket": bucket, "domain": domain}
ctype_id, domain, _ = await getObjectIdByPath(app, group_id, h5path, **kwargs)
if not isValidUuid(ctype_id, "Datatype"):
if not isValidUuid(ctype_id, "datatypes"):
msg = f"No datatype exist with the path: {h5path}"
log.warn(msg)
raise HTTPGone()
Expand Down Expand Up @@ -271,7 +273,7 @@ async def DELETE_Datatype(request):
msg = "Missing committed type id"
log.warn(msg)
raise HTTPBadRequest(reason=msg)
if not isValidUuid(ctype_id, "Type"):
if not isValidUuid(ctype_id, "datatypes"):
msg = f"Invalid committed type id: {ctype_id}"
log.warn(msg)
raise HTTPBadRequest(reason=msg)
Expand Down
5 changes: 3 additions & 2 deletions hsds/datanode.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
import traceback
from aiohttp.web import run_app

from h5json.objid import isValidUuid, isSchema2Id, getCollectionForId
from h5json.objid import isRootObjId

from . import config
from .util.lruCache import LruCache
from .util.idUtil import isValidUuid, isSchema2Id, getCollectionForId
from .util.idUtil import isRootObjId
from .util.httpUtil import isUnixDomainUrl, bindToSocket, getPortFromUrl
from .util.httpUtil import jsonResponse, release_http_client
from .util.storUtil import setBloscThreads, getBloscThreads
Expand Down
14 changes: 9 additions & 5 deletions hsds/datanode_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,14 @@
from aiohttp.web_exceptions import HTTPGone, HTTPInternalServerError
from aiohttp.web_exceptions import HTTPNotFound, HTTPForbidden
from aiohttp.web_exceptions import HTTPServiceUnavailable, HTTPBadRequest
from .util.idUtil import validateInPartition, getS3Key, isValidUuid
from .util.idUtil import isValidChunkId, getDataNodeUrl, isSchema2Id
from .util.idUtil import getRootObjId, isRootObjId

from h5json.hdf5dtype import createDataType
from h5json.array_util import arrayToBytes, bytesToArray, jsonToArray
from h5json.objid import getS3Key, isValidUuid
from h5json.objid import isValidChunkId, isSchema2Id
from h5json.objid import getRootObjId, isRootObjId

from .util.nodeUtil import getDataNodeUrl
from .util.storUtil import getStorJSONObj, putStorJSONObj, putStorBytes
from .util.storUtil import getStorBytes, isStorObj, deleteStorObj, getHyperChunks
from .util.storUtil import getBucketFromStorURI, getKeyFromStorURI, getURIFromKey
Expand All @@ -31,8 +36,7 @@
from .util.dsetUtil import getChunkLayout, getFilterOps, getShapeDims
from .util.dsetUtil import getChunkInitializer, getSliceQueryParam, getFilters
from .util.chunkUtil import getDatasetId, getChunkSelection, getChunkIndex
from .util.arrayUtil import arrayToBytes, bytesToArray, jsonToArray
from .util.hdf5dtype import createDataType
from .util.nodeUtil import validateInPartition
from .util.rangegetUtil import ChunkLocation, chunkMunge, getHyperChunkIndex, getHyperChunkFactors
from .util.timeUtil import getNow
from . import config
Expand Down
4 changes: 3 additions & 1 deletion hsds/domain_crawl.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
from aiohttp.web_exceptions import HTTPServiceUnavailable, HTTPConflict, HTTPBadRequest
from aiohttp.web_exceptions import HTTPInternalServerError, HTTPNotFound, HTTPGone

from h5json.objid import getCollectionForId

from .util.nodeUtil import getDataNodeUrl
from .util.httpUtil import isOK
from .util.idUtil import getCollectionForId, getDataNodeUrl
from .util.globparser import globmatch
from .servicenode_lib import getObjectJson, getAttributes, putAttributes, getLinks, putLinks
from . import hsds_logger as log
Expand Down
2 changes: 1 addition & 1 deletion hsds/domain_dn.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

from .util.authUtil import getAclKeys
from .util.domainUtil import isValidDomain, getBucketForDomain
from .util.idUtil import validateInPartition
from .util.nodeUtil import validateInPartition
from .util.timeUtil import getNow
from .datanode_lib import get_metadata_obj, save_metadata_obj
from .datanode_lib import delete_metadata_obj, check_metadata_obj
Expand Down
8 changes: 5 additions & 3 deletions hsds/domain_sn.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
from aiohttp.web_exceptions import HTTPConflict, HTTPServiceUnavailable
from aiohttp.web import json_response

from h5json.objid import createObjId, getCollectionForId
from h5json.objid import isValidUuid, isSchema2Id

from .util.nodeUtil import getNodeCount, getDataNodeUrl
from .util.httpUtil import getObjectClass, http_post, http_put, http_delete
from .util.httpUtil import getHref, respJsonAssemble
from .util.httpUtil import jsonResponse
from .util.idUtil import getDataNodeUrl, createObjId, getCollectionForId
from .util.idUtil import isValidUuid, isSchema2Id, getNodeCount
from .util.authUtil import getUserPasswordFromRequest, aclCheck, isAdminUser
from .util.authUtil import validateUserPassword, getAclKeys
from .util.domainUtil import getParentDomain, getDomainFromRequest
Expand Down Expand Up @@ -983,7 +985,7 @@ async def PUT_Domain(request):

if not is_folder and not linked_json:
# create a root group for the new domain
root_id = createObjId("roots")
root_id = createObjId("groups")
log.debug(f"new root group id: {root_id}")
group_json = {"id": root_id, "root": root_id, "domain": domain}
log.debug(f"create group for domain, body: {group_json}")
Expand Down
10 changes: 5 additions & 5 deletions hsds/dset_dn.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web import json_response

from h5json.objid import isValidUuid, validateUuid

from .util.idUtil import isValidUuid, validateUuid
from .util.domainUtil import isValidBucketName
from .util.timeUtil import getNow
from .datanode_lib import get_obj_id, check_metadata_obj, get_metadata_obj
Expand All @@ -33,7 +33,7 @@ async def GET_Dataset(request):
params = request.rel_url.query
dset_id = get_obj_id(request)

if not isValidUuid(dset_id, obj_class="dataset"):
if not isValidUuid(dset_id, obj_class="datasets"):
log.error(f"Unexpected dataset_id: {dset_id}")
raise HTTPInternalServerError()
if "bucket" in params:
Expand Down Expand Up @@ -94,7 +94,7 @@ async def POST_Dataset(request):
raise HTTPBadRequest(reason=msg)

dset_id = get_obj_id(request, body=body)
if not isValidUuid(dset_id, obj_class="dataset"):
if not isValidUuid(dset_id, obj_class="datasets"):
log.error(f"Unexpected dataset_id: {dset_id}")
raise HTTPInternalServerError()

Expand Down Expand Up @@ -176,7 +176,7 @@ async def DELETE_Dataset(request):
dset_id = request.match_info.get("id")
log.info(f"DELETE dataset: {dset_id}")

if not isValidUuid(dset_id, obj_class="dataset"):
if not isValidUuid(dset_id, obj_class="datasets"):
log.error(f"Unexpected dataset id: {dset_id}")
raise HTTPInternalServerError()

Expand Down Expand Up @@ -220,7 +220,7 @@ async def PUT_DatasetShape(request):
params = request.rel_url.query
dset_id = request.match_info.get("id")

if not isValidUuid(dset_id, obj_class="dataset"):
if not isValidUuid(dset_id, obj_class="datasets"):
log.error(f"Unexpected dset_id: {dset_id}")
raise HTTPInternalServerError()

Expand Down
Loading
Loading