in airavata_django_portal_sdk/user_storage/backends/mft_provider.py [0:0]
def get_metadata(self, resource_path):
with grpc.insecure_channel(self.mft_api_endpoint) as channel:
child_path = self._get_child_path(resource_path)
stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
request = MFTApi_pb2.FetchResourceMetadataRequest(
# resourceId="remote-ssh-dir-resource",
resourceId=self.resource_id,
resourceType="SCP",
# resourceToken="local-ssh-cred",
resourceToken=self.resource_token,
resourceBackend="FILE",
resourceCredentialBackend="FILE",
targetAgentId="agent0",
childPath=child_path,
mftAuthorizationToken=self.auth_token)
try:
logger.debug(f"getDirectoryResourceMetadata({request})")
response = stub.getDirectoryResourceMetadata(request)
logger.debug(f"getDirectoryResourceMetadata response={response}")
directories = response.directories
files = response.files
except Exception:
# if getting metadata for directory fails, try as file
# FIXME is there a better way to determine if directory or file?
logger.debug(f"getFileResourceMetadata({request})")
response = stub.getFileResourceMetadata(request)
logger.debug(f"getFileResourceMetadata response={response}")
directories = []
files = [response]
directories_data = []
for d in directories:
dpath = os.path.join(resource_path, d.friendlyName)
created_time = datetime.fromtimestamp(d.createdTime)
modified_time = datetime.fromtimestamp(d.updateTime)
# TODO MFT API doesn't report size
size = 0
directories_data.append(
{
"name": d.friendlyName,
# path is the relative path, or at least, relative to given resource_path
"path": dpath,
# resource_path is the id or full path to the resource
"resource_path": d.resourcePath,
"created_time": created_time,
"modified_time": modified_time,
"size": size,
}
)
files_data = []
for f in files:
user_rel_path = os.path.join(resource_path, f.friendlyName)
# TODO do we need to check for broken symlinks?
created_time = datetime.fromtimestamp(f.createdTime)
modified_time = datetime.fromtimestamp(f.updateTime)
size = f.resourceSize
# full_path = datastore.path(request.user.username, user_rel_path)
# TODO how do we register these as data products, do we need to?
# data_product_uri = _get_data_product_uri(request, full_path)
# data_product = request.airavata_client.getDataProduct(
# request.authz_token, data_product_uri)
# mime_type = None
# if 'mime-type' in data_product.productMetadata:
# mime_type = data_product.productMetadata['mime-type']
files_data.append(
{
"name": f.friendlyName,
"path": user_rel_path,
"resource_path": f.resourcePath,
"created_time": created_time,
"modified_time": modified_time,
"size": size,
}
)
return directories_data, files_data