def get_metadata()

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