You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2021/04/26 20:54:59 UTC

[airavata-django-portal-sdk] 01/07: WIP: UserStorageProvider abstraction

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch mft-integration
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal-sdk.git

commit c687b45420a98ee9ef995408f876b60c1e8cdb4b
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue Mar 23 15:28:25 2021 -0400

    WIP: UserStorageProvider abstraction
---
 airavata_django_portal_sdk/MFTApi_pb2.py           | 1100 ++++++++++++++++++++
 airavata_django_portal_sdk/MFTApi_pb2_grpc.py      |  297 ++++++
 airavata_django_portal_sdk/user_storage.py         |  357 +++++--
 .../user_storage_provider.py                       |  160 +++
 requirements.txt                                   |    9 +-
 5 files changed, 1842 insertions(+), 81 deletions(-)

diff --git a/airavata_django_portal_sdk/MFTApi_pb2.py b/airavata_django_portal_sdk/MFTApi_pb2.py
new file mode 100644
index 0000000..1e89796
--- /dev/null
+++ b/airavata_django_portal_sdk/MFTApi_pb2.py
@@ -0,0 +1,1100 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: MFTApi.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='MFTApi.proto',
+  package='org.apache.airavata.mft.api.service',
+  syntax='proto3',
+  serialized_options=b'P\001',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x0cMFTApi.proto\x12#org.apache.airavata.mft.api.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\"\x9f\x04\n\x12TransferApiRequest\x12\x17\n\x0fsourceStorageId\x18\x01 \x01(\t\x12\x12\n\nsourcePath\x18\x02 \x01(\t\x12\x12\n\nsourceType\x18\x03 \x01(\t\x12\x13\n\x0bsourceToken\x18\x04 \x01(\t\x12\x1d\n\x15sourceResourceBackend\x18\x05 \x01(\t\x12\x1f\n\x17sourceCredentialBackend\x18\x06 \x01(\t\x12\x1c\n\x14\x64\x65stinationStorageId\x18\ [...]
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_TRANSFERAPIREQUEST_TARGETAGENTSENTRY = _descriptor.Descriptor(
+  name='TargetAgentsEntry',
+  full_name='org.apache.airavata.mft.api.service.TransferApiRequest.TargetAgentsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.TargetAgentsEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.TargetAgentsEntry.value', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=605,
+  serialized_end=656,
+)
+
+_TRANSFERAPIREQUEST = _descriptor.Descriptor(
+  name='TransferApiRequest',
+  full_name='org.apache.airavata.mft.api.service.TransferApiRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sourceStorageId', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourceStorageId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourcePath', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourcePath', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceType', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourceType', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceToken', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourceToken', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceResourceBackend', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourceResourceBackend', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceCredentialBackend', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.sourceCredentialBackend', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationStorageId', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destinationStorageId', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationPath', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destinationPath', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationType', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destinationType', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationToken', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destinationToken', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destResourceBackend', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destResourceBackend', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destCredentialBackend', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.destCredentialBackend', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='affinityTransfer', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.affinityTransfer', index=12,
+      number=13, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgents', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.targetAgents', index=13,
+      number=14, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.TransferApiRequest.mftAuthorizationToken', index=14,
+      number=15, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_TRANSFERAPIREQUEST_TARGETAGENTSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=113,
+  serialized_end=656,
+)
+
+
+_TRANSFERAPIRESPONSE = _descriptor.Descriptor(
+  name='TransferApiResponse',
+  full_name='org.apache.airavata.mft.api.service.TransferApiResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='transferId', full_name='org.apache.airavata.mft.api.service.TransferApiResponse.transferId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=658,
+  serialized_end=699,
+)
+
+
+_HTTPUPLOADAPIREQUEST = _descriptor.Descriptor(
+  name='HttpUploadApiRequest',
+  full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='destinationStoreId', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.destinationStoreId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationPath', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.destinationPath', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationToken', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.destinationToken', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='destinationType', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.destinationType', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgent', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.targetAgent', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.HttpUploadApiRequest.mftAuthorizationToken', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=702,
+  serialized_end=880,
+)
+
+
+_HTTPUPLOADAPIRESPONSE = _descriptor.Descriptor(
+  name='HttpUploadApiResponse',
+  full_name='org.apache.airavata.mft.api.service.HttpUploadApiResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='url', full_name='org.apache.airavata.mft.api.service.HttpUploadApiResponse.url', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgent', full_name='org.apache.airavata.mft.api.service.HttpUploadApiResponse.targetAgent', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=882,
+  serialized_end=939,
+)
+
+
+_HTTPDOWNLOADAPIREQUEST = _descriptor.Descriptor(
+  name='HttpDownloadApiRequest',
+  full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sourceStoreId', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.sourceStoreId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourcePath', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.sourcePath', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceToken', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.sourceToken', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sourceType', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.sourceType', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgent', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.targetAgent', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiRequest.mftAuthorizationToken', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=942,
+  serialized_end=1102,
+)
+
+
+_HTTPDOWNLOADAPIRESPONSE = _descriptor.Descriptor(
+  name='HttpDownloadApiResponse',
+  full_name='org.apache.airavata.mft.api.service.HttpDownloadApiResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='url', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiResponse.url', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgent', full_name='org.apache.airavata.mft.api.service.HttpDownloadApiResponse.targetAgent', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1104,
+  serialized_end=1163,
+)
+
+
+_TRANSFERSTATEAPIREQUEST = _descriptor.Descriptor(
+  name='TransferStateApiRequest',
+  full_name='org.apache.airavata.mft.api.service.TransferStateApiRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='transferId', full_name='org.apache.airavata.mft.api.service.TransferStateApiRequest.transferId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.TransferStateApiRequest.mftAuthorizationToken', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1165,
+  serialized_end=1241,
+)
+
+
+_TRANSFERSTATEAPIRESPONSE = _descriptor.Descriptor(
+  name='TransferStateApiResponse',
+  full_name='org.apache.airavata.mft.api.service.TransferStateApiResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='org.apache.airavata.mft.api.service.TransferStateApiResponse.state', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updateTimeMils', full_name='org.apache.airavata.mft.api.service.TransferStateApiResponse.updateTimeMils', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='percentage', full_name='org.apache.airavata.mft.api.service.TransferStateApiResponse.percentage', index=2,
+      number=3, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.airavata.mft.api.service.TransferStateApiResponse.description', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1243,
+  serialized_end=1349,
+)
+
+
+_RESOURCEAVAILABILITYREQUEST = _descriptor.Descriptor(
+  name='ResourceAvailabilityRequest',
+  full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='resourceId', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.resourceId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceType', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.resourceType', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceToken', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.resourceToken', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceBackend', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.resourceBackend', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceCredentialBackend', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.resourceCredentialBackend', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityRequest.mftAuthorizationToken', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1352,
+  serialized_end=1537,
+)
+
+
+_RESOURCEAVAILABILITYRESPONSE = _descriptor.Descriptor(
+  name='ResourceAvailabilityResponse',
+  full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='available', full_name='org.apache.airavata.mft.api.service.ResourceAvailabilityResponse.available', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1539,
+  serialized_end=1588,
+)
+
+
+_FILEMETADATARESPONSE = _descriptor.Descriptor(
+  name='FileMetadataResponse',
+  full_name='org.apache.airavata.mft.api.service.FileMetadataResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='friendlyName', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.friendlyName', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceSize', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.resourceSize', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='createdTime', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.createdTime', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updateTime', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.updateTime', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='md5sum', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.md5sum', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourcePath', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.resourcePath', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parentResourceId', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.parentResourceId', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parentResourceType', full_name='org.apache.airavata.mft.api.service.FileMetadataResponse.parentResourceType', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1591,
+  serialized_end=1790,
+)
+
+
+_DIRECTORYMETADATARESPONSE = _descriptor.Descriptor(
+  name='DirectoryMetadataResponse',
+  full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='friendlyName', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.friendlyName', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='createdTime', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.createdTime', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updateTime', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.updateTime', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourcePath', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.resourcePath', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parentResourceId', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.parentResourceId', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parentResourceType', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.parentResourceType', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='directories', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.directories', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='files', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.files', index=7,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='lazyInitialized', full_name='org.apache.airavata.mft.api.service.DirectoryMetadataResponse.lazyInitialized', index=8,
+      number=9, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1793,
+  serialized_end=2143,
+)
+
+
+_FETCHRESOURCEMETADATAREQUEST = _descriptor.Descriptor(
+  name='FetchResourceMetadataRequest',
+  full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='resourceId', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.resourceId', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceType', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.resourceType', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceToken', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.resourceToken', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceBackend', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.resourceBackend', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resourceCredentialBackend', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.resourceCredentialBackend', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='targetAgentId', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.targetAgentId', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='childPath', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.childPath', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mftAuthorizationToken', full_name='org.apache.airavata.mft.api.service.FetchResourceMetadataRequest.mftAuthorizationToken', index=7,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2146,
+  serialized_end=2374,
+)
+
+_TRANSFERAPIREQUEST_TARGETAGENTSENTRY.containing_type = _TRANSFERAPIREQUEST
+_TRANSFERAPIREQUEST.fields_by_name['targetAgents'].message_type = _TRANSFERAPIREQUEST_TARGETAGENTSENTRY
+_DIRECTORYMETADATARESPONSE.fields_by_name['directories'].message_type = _DIRECTORYMETADATARESPONSE
+_DIRECTORYMETADATARESPONSE.fields_by_name['files'].message_type = _FILEMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['TransferApiRequest'] = _TRANSFERAPIREQUEST
+DESCRIPTOR.message_types_by_name['TransferApiResponse'] = _TRANSFERAPIRESPONSE
+DESCRIPTOR.message_types_by_name['HttpUploadApiRequest'] = _HTTPUPLOADAPIREQUEST
+DESCRIPTOR.message_types_by_name['HttpUploadApiResponse'] = _HTTPUPLOADAPIRESPONSE
+DESCRIPTOR.message_types_by_name['HttpDownloadApiRequest'] = _HTTPDOWNLOADAPIREQUEST
+DESCRIPTOR.message_types_by_name['HttpDownloadApiResponse'] = _HTTPDOWNLOADAPIRESPONSE
+DESCRIPTOR.message_types_by_name['TransferStateApiRequest'] = _TRANSFERSTATEAPIREQUEST
+DESCRIPTOR.message_types_by_name['TransferStateApiResponse'] = _TRANSFERSTATEAPIRESPONSE
+DESCRIPTOR.message_types_by_name['ResourceAvailabilityRequest'] = _RESOURCEAVAILABILITYREQUEST
+DESCRIPTOR.message_types_by_name['ResourceAvailabilityResponse'] = _RESOURCEAVAILABILITYRESPONSE
+DESCRIPTOR.message_types_by_name['FileMetadataResponse'] = _FILEMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['DirectoryMetadataResponse'] = _DIRECTORYMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['FetchResourceMetadataRequest'] = _FETCHRESOURCEMETADATAREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+TransferApiRequest = _reflection.GeneratedProtocolMessageType('TransferApiRequest', (_message.Message,), {
+
+  'TargetAgentsEntry' : _reflection.GeneratedProtocolMessageType('TargetAgentsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _TRANSFERAPIREQUEST_TARGETAGENTSENTRY,
+    '__module__' : 'MFTApi_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.TransferApiRequest.TargetAgentsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _TRANSFERAPIREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.TransferApiRequest)
+  })
+_sym_db.RegisterMessage(TransferApiRequest)
+_sym_db.RegisterMessage(TransferApiRequest.TargetAgentsEntry)
+
+TransferApiResponse = _reflection.GeneratedProtocolMessageType('TransferApiResponse', (_message.Message,), {
+  'DESCRIPTOR' : _TRANSFERAPIRESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.TransferApiResponse)
+  })
+_sym_db.RegisterMessage(TransferApiResponse)
+
+HttpUploadApiRequest = _reflection.GeneratedProtocolMessageType('HttpUploadApiRequest', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPUPLOADAPIREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.HttpUploadApiRequest)
+  })
+_sym_db.RegisterMessage(HttpUploadApiRequest)
+
+HttpUploadApiResponse = _reflection.GeneratedProtocolMessageType('HttpUploadApiResponse', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPUPLOADAPIRESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.HttpUploadApiResponse)
+  })
+_sym_db.RegisterMessage(HttpUploadApiResponse)
+
+HttpDownloadApiRequest = _reflection.GeneratedProtocolMessageType('HttpDownloadApiRequest', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPDOWNLOADAPIREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.HttpDownloadApiRequest)
+  })
+_sym_db.RegisterMessage(HttpDownloadApiRequest)
+
+HttpDownloadApiResponse = _reflection.GeneratedProtocolMessageType('HttpDownloadApiResponse', (_message.Message,), {
+  'DESCRIPTOR' : _HTTPDOWNLOADAPIRESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.HttpDownloadApiResponse)
+  })
+_sym_db.RegisterMessage(HttpDownloadApiResponse)
+
+TransferStateApiRequest = _reflection.GeneratedProtocolMessageType('TransferStateApiRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TRANSFERSTATEAPIREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.TransferStateApiRequest)
+  })
+_sym_db.RegisterMessage(TransferStateApiRequest)
+
+TransferStateApiResponse = _reflection.GeneratedProtocolMessageType('TransferStateApiResponse', (_message.Message,), {
+  'DESCRIPTOR' : _TRANSFERSTATEAPIRESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.TransferStateApiResponse)
+  })
+_sym_db.RegisterMessage(TransferStateApiResponse)
+
+ResourceAvailabilityRequest = _reflection.GeneratedProtocolMessageType('ResourceAvailabilityRequest', (_message.Message,), {
+  'DESCRIPTOR' : _RESOURCEAVAILABILITYREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.ResourceAvailabilityRequest)
+  })
+_sym_db.RegisterMessage(ResourceAvailabilityRequest)
+
+ResourceAvailabilityResponse = _reflection.GeneratedProtocolMessageType('ResourceAvailabilityResponse', (_message.Message,), {
+  'DESCRIPTOR' : _RESOURCEAVAILABILITYRESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.ResourceAvailabilityResponse)
+  })
+_sym_db.RegisterMessage(ResourceAvailabilityResponse)
+
+FileMetadataResponse = _reflection.GeneratedProtocolMessageType('FileMetadataResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FILEMETADATARESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.FileMetadataResponse)
+  })
+_sym_db.RegisterMessage(FileMetadataResponse)
+
+DirectoryMetadataResponse = _reflection.GeneratedProtocolMessageType('DirectoryMetadataResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DIRECTORYMETADATARESPONSE,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.DirectoryMetadataResponse)
+  })
+_sym_db.RegisterMessage(DirectoryMetadataResponse)
+
+FetchResourceMetadataRequest = _reflection.GeneratedProtocolMessageType('FetchResourceMetadataRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FETCHRESOURCEMETADATAREQUEST,
+  '__module__' : 'MFTApi_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.api.service.FetchResourceMetadataRequest)
+  })
+_sym_db.RegisterMessage(FetchResourceMetadataRequest)
+
+
+DESCRIPTOR._options = None
+_TRANSFERAPIREQUEST_TARGETAGENTSENTRY._options = None
+
+_MFTAPISERVICE = _descriptor.ServiceDescriptor(
+  name='MFTApiService',
+  full_name='org.apache.airavata.mft.api.service.MFTApiService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2377,
+  serialized_end=3838,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='submitTransfer',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.submitTransfer',
+    index=0,
+    containing_service=None,
+    input_type=_TRANSFERAPIREQUEST,
+    output_type=_TRANSFERAPIRESPONSE,
+    serialized_options=b'\202\323\344\223\002\024\"\022/v1.0/api/transfer',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='submitHttpUpload',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.submitHttpUpload',
+    index=1,
+    containing_service=None,
+    input_type=_HTTPUPLOADAPIREQUEST,
+    output_type=_HTTPUPLOADAPIRESPONSE,
+    serialized_options=b'\202\323\344\223\002\027\"\025/v1.0/api/http-upload',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='submitHttpDownload',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.submitHttpDownload',
+    index=2,
+    containing_service=None,
+    input_type=_HTTPDOWNLOADAPIREQUEST,
+    output_type=_HTTPDOWNLOADAPIRESPONSE,
+    serialized_options=b'\202\323\344\223\002\031\"\027/v1.0/api/http-download',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTransferStates',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.getTransferStates',
+    index=3,
+    containing_service=None,
+    input_type=_TRANSFERSTATEAPIREQUEST,
+    output_type=_TRANSFERSTATEAPIRESPONSE,
+    serialized_options=b'\202\323\344\223\002\033\022\031/v1.0/api/transfer/states',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTransferState',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.getTransferState',
+    index=4,
+    containing_service=None,
+    input_type=_TRANSFERSTATEAPIREQUEST,
+    output_type=_TRANSFERSTATEAPIRESPONSE,
+    serialized_options=b'\202\323\344\223\002\032\022\030/v1.0/api/transfer/state',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getResourceAvailability',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.getResourceAvailability',
+    index=5,
+    containing_service=None,
+    input_type=_RESOURCEAVAILABILITYREQUEST,
+    output_type=_RESOURCEAVAILABILITYRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getFileResourceMetadata',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.getFileResourceMetadata',
+    index=6,
+    containing_service=None,
+    input_type=_FETCHRESOURCEMETADATAREQUEST,
+    output_type=_FILEMETADATARESPONSE,
+    serialized_options=b'\202\323\344\223\002\"\022 /v1.0/api/resource/metadata/file',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getDirectoryResourceMetadata',
+    full_name='org.apache.airavata.mft.api.service.MFTApiService.getDirectoryResourceMetadata',
+    index=7,
+    containing_service=None,
+    input_type=_FETCHRESOURCEMETADATAREQUEST,
+    output_type=_DIRECTORYMETADATARESPONSE,
+    serialized_options=b'\202\323\344\223\002\'\022%/v1.0/api/resource/metadata/directory',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_MFTAPISERVICE)
+
+DESCRIPTOR.services_by_name['MFTApiService'] = _MFTAPISERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/airavata_django_portal_sdk/MFTApi_pb2_grpc.py b/airavata_django_portal_sdk/MFTApi_pb2_grpc.py
new file mode 100644
index 0000000..6bb694c
--- /dev/null
+++ b/airavata_django_portal_sdk/MFTApi_pb2_grpc.py
@@ -0,0 +1,297 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from . import MFTApi_pb2 as MFTApi__pb2
+
+
+class MFTApiServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.submitTransfer = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/submitTransfer',
+                request_serializer=MFTApi__pb2.TransferApiRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.TransferApiResponse.FromString,
+                )
+        self.submitHttpUpload = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/submitHttpUpload',
+                request_serializer=MFTApi__pb2.HttpUploadApiRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.HttpUploadApiResponse.FromString,
+                )
+        self.submitHttpDownload = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/submitHttpDownload',
+                request_serializer=MFTApi__pb2.HttpDownloadApiRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.HttpDownloadApiResponse.FromString,
+                )
+        self.getTransferStates = channel.unary_stream(
+                '/org.apache.airavata.mft.api.service.MFTApiService/getTransferStates',
+                request_serializer=MFTApi__pb2.TransferStateApiRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.TransferStateApiResponse.FromString,
+                )
+        self.getTransferState = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/getTransferState',
+                request_serializer=MFTApi__pb2.TransferStateApiRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.TransferStateApiResponse.FromString,
+                )
+        self.getResourceAvailability = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/getResourceAvailability',
+                request_serializer=MFTApi__pb2.ResourceAvailabilityRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.ResourceAvailabilityResponse.FromString,
+                )
+        self.getFileResourceMetadata = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/getFileResourceMetadata',
+                request_serializer=MFTApi__pb2.FetchResourceMetadataRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.FileMetadataResponse.FromString,
+                )
+        self.getDirectoryResourceMetadata = channel.unary_unary(
+                '/org.apache.airavata.mft.api.service.MFTApiService/getDirectoryResourceMetadata',
+                request_serializer=MFTApi__pb2.FetchResourceMetadataRequest.SerializeToString,
+                response_deserializer=MFTApi__pb2.DirectoryMetadataResponse.FromString,
+                )
+
+
+class MFTApiServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def submitTransfer(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def submitHttpUpload(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def submitHttpDownload(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTransferStates(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTransferState(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getResourceAvailability(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getFileResourceMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getDirectoryResourceMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_MFTApiServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'submitTransfer': grpc.unary_unary_rpc_method_handler(
+                    servicer.submitTransfer,
+                    request_deserializer=MFTApi__pb2.TransferApiRequest.FromString,
+                    response_serializer=MFTApi__pb2.TransferApiResponse.SerializeToString,
+            ),
+            'submitHttpUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.submitHttpUpload,
+                    request_deserializer=MFTApi__pb2.HttpUploadApiRequest.FromString,
+                    response_serializer=MFTApi__pb2.HttpUploadApiResponse.SerializeToString,
+            ),
+            'submitHttpDownload': grpc.unary_unary_rpc_method_handler(
+                    servicer.submitHttpDownload,
+                    request_deserializer=MFTApi__pb2.HttpDownloadApiRequest.FromString,
+                    response_serializer=MFTApi__pb2.HttpDownloadApiResponse.SerializeToString,
+            ),
+            'getTransferStates': grpc.unary_stream_rpc_method_handler(
+                    servicer.getTransferStates,
+                    request_deserializer=MFTApi__pb2.TransferStateApiRequest.FromString,
+                    response_serializer=MFTApi__pb2.TransferStateApiResponse.SerializeToString,
+            ),
+            'getTransferState': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTransferState,
+                    request_deserializer=MFTApi__pb2.TransferStateApiRequest.FromString,
+                    response_serializer=MFTApi__pb2.TransferStateApiResponse.SerializeToString,
+            ),
+            'getResourceAvailability': grpc.unary_unary_rpc_method_handler(
+                    servicer.getResourceAvailability,
+                    request_deserializer=MFTApi__pb2.ResourceAvailabilityRequest.FromString,
+                    response_serializer=MFTApi__pb2.ResourceAvailabilityResponse.SerializeToString,
+            ),
+            'getFileResourceMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getFileResourceMetadata,
+                    request_deserializer=MFTApi__pb2.FetchResourceMetadataRequest.FromString,
+                    response_serializer=MFTApi__pb2.FileMetadataResponse.SerializeToString,
+            ),
+            'getDirectoryResourceMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getDirectoryResourceMetadata,
+                    request_deserializer=MFTApi__pb2.FetchResourceMetadataRequest.FromString,
+                    response_serializer=MFTApi__pb2.DirectoryMetadataResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.airavata.mft.api.service.MFTApiService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class MFTApiService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def submitTransfer(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/submitTransfer',
+            MFTApi__pb2.TransferApiRequest.SerializeToString,
+            MFTApi__pb2.TransferApiResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def submitHttpUpload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/submitHttpUpload',
+            MFTApi__pb2.HttpUploadApiRequest.SerializeToString,
+            MFTApi__pb2.HttpUploadApiResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def submitHttpDownload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/submitHttpDownload',
+            MFTApi__pb2.HttpDownloadApiRequest.SerializeToString,
+            MFTApi__pb2.HttpDownloadApiResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTransferStates(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/getTransferStates',
+            MFTApi__pb2.TransferStateApiRequest.SerializeToString,
+            MFTApi__pb2.TransferStateApiResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTransferState(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/getTransferState',
+            MFTApi__pb2.TransferStateApiRequest.SerializeToString,
+            MFTApi__pb2.TransferStateApiResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getResourceAvailability(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/getResourceAvailability',
+            MFTApi__pb2.ResourceAvailabilityRequest.SerializeToString,
+            MFTApi__pb2.ResourceAvailabilityResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getFileResourceMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/getFileResourceMetadata',
+            MFTApi__pb2.FetchResourceMetadataRequest.SerializeToString,
+            MFTApi__pb2.FileMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getDirectoryResourceMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.airavata.mft.api.service.MFTApiService/getDirectoryResourceMetadata',
+            MFTApi__pb2.FetchResourceMetadataRequest.SerializeToString,
+            MFTApi__pb2.DirectoryMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/airavata_django_portal_sdk/user_storage.py b/airavata_django_portal_sdk/user_storage.py
index 76d749a..5fb07c5 100644
--- a/airavata_django_portal_sdk/user_storage.py
+++ b/airavata_django_portal_sdk/user_storage.py
@@ -6,9 +6,11 @@ import mimetypes
 import os
 import shutil
 import warnings
+from datetime import datetime
 from http import HTTPStatus
 from urllib.parse import quote, unquote, urlparse
 
+import grpc
 import requests
 from airavata.model.data.replica.ttypes import (
     DataProductModel,
@@ -23,6 +25,7 @@ from django.core.files import File
 from django.core.files.move import file_move_safe
 from django.core.files.storage import FileSystemStorage
 
+from . import MFTApi_pb2, MFTApi_pb2_grpc
 from .util import convert_iso8601_to_datetime
 
 logger = logging.getLogger(__name__)
@@ -63,6 +66,7 @@ def move_from_filepath(
         name=None,
         content_type=None):
     "Move a file from filesystem into user's storage."
+    # TODO: deprecate this method
     username = request.user.username
     file_name = name if name is not None else os.path.basename(source_path)
     full_path = _Datastore().move_external(
@@ -100,6 +104,8 @@ def save_input_file(request, file, name=None, content_type=None):
 
 
 def copy_input_file(request, data_product=None, data_product_uri=None):
+    # TODO: we could probably deprecate this as well, since we do an open/save
+    # to copy instead. Or at least, we don't need it in UserStorageProvider.
     if data_product is None:
         data_product = _get_data_product(request, data_product_uri)
     path = _get_replica_filepath(data_product)
@@ -115,6 +121,7 @@ def copy_input_file(request, data_product=None, data_product_uri=None):
 
 
 def is_input_file(request, data_product=None, data_product_uri=None):
+    # TODO: don't need this in UserStorageProvider
     if data_product is None:
         data_product = _get_data_product(request, data_product_uri)
     if _is_remote_api():
@@ -134,6 +141,7 @@ def is_input_file(request, data_product=None, data_product_uri=None):
 
 
 def move_input_file(request, data_product=None, path=None, data_product_uri=None):
+    # TODO: don't need this in UserStorageProvider
     if data_product is None:
         data_product = _get_data_product(request, data_product_uri)
     source_path = _get_replica_filepath(data_product)
@@ -152,6 +160,7 @@ def move_input_file(request, data_product=None, path=None, data_product_uri=None
 def move_input_file_from_filepath(
     request, source_path, name=None, content_type=None
 ):
+    # TODO: don't need this in UserStorageProvider
     "Move a file from filesystem into user's input file staging area."
     username = request.user.username
     file_name = name if name is not None else os.path.basename(source_path)
@@ -218,7 +227,8 @@ def dir_exists(request, path):
         resp.raise_for_status()
         return resp.json()['isDir']
     else:
-        return _Datastore().dir_exists(request.user.username, path)
+        user_storage_provider = MFTApiUserStorageProvider()
+        return user_storage_provider.dir_exists(request, path)
 
 
 def user_file_exists(request, path):
@@ -311,32 +321,9 @@ def get_file(request, path):
         file['mime_type'] = file['mimeType']
         file['data-product-uri'] = file['dataProductURI']
         return file
-    datastore = _Datastore()
-    if datastore.exists(request.user.username, path):
-        created_time = datastore.get_created_time(
-            request.user.username, path)
-        size = datastore.size(request.user.username, path)
-        full_path = datastore.path(request.user.username, path)
-        data_product_uri = _get_data_product_uri(request, full_path)
-        dir_path, file_name = os.path.split(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']
-
-        return {
-            'name': full_path,
-            'path': dir_path,
-            'data-product-uri': data_product_uri,
-            'created_time': created_time,
-            'mime_type': mime_type,
-            'size': size,
-            'hidden': False
-        }
-    else:
-        raise ObjectDoesNotExist("User storage file path does not exist")
+    user_storage_provider = MFTApiUserStorageProvider()
+    return user_storage_provider.get_file(request, path)
 
 
 def delete(request, data_product=None, data_product_uri=None):
@@ -388,58 +375,8 @@ def listdir(request, path):
             file['data-product-uri'] = file['dataProductURI']
         return data['directories'], data['files']
 
-    datastore = _Datastore()
-    if datastore.dir_exists(request.user.username, path):
-        directories, files = datastore.list_user_dir(
-            request.user.username, path)
-        directories_data = []
-        for d in directories:
-            dpath = os.path.join(path, d)
-            created_time = datastore.get_created_time(
-                request.user.username, dpath)
-            size = datastore.size(request.user.username, dpath)
-            directories_data.append(
-                {
-                    "name": d,
-                    "path": dpath,
-                    "created_time": created_time,
-                    "size": size,
-                    "hidden": dpath == TMP_INPUT_FILE_UPLOAD_DIR,
-                }
-            )
-        files_data = []
-        for f in files:
-            user_rel_path = os.path.join(path, f)
-            if not datastore.exists(request.user.username, user_rel_path):
-                logger.warning(f"listdir skipping {request.user.username}:{user_rel_path}, "
-                               "does not exist (broken symlink?)")
-                continue
-            created_time = datastore.get_created_time(
-                request.user.username, user_rel_path
-            )
-            size = datastore.size(request.user.username, user_rel_path)
-            full_path = datastore.path(request.user.username, user_rel_path)
-            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,
-                    "path": user_rel_path,
-                    "data-product-uri": data_product_uri,
-                    "created_time": created_time,
-                    "mime_type": mime_type,
-                    "size": size,
-                    "hidden": False,
-                }
-            )
-        return directories_data, files_data
-    else:
-        raise ObjectDoesNotExist("User storage path does not exist")
+    user_storage_provider = MFTApiUserStorageProvider()
+    return user_storage_provider.listdir(request, path)
 
 
 def list_experiment_dir(request, experiment_id, path=""):
@@ -993,3 +930,267 @@ class _Datastore:
                 if os.path.exists(fp):
                     total_size += os.path.getsize(fp)
         return total_size
+
+
+class UserStorageProvider:
+    def dir_exists(self, request, path):
+        raise NotImplementedError()
+
+    def listdir(self, request, path):
+        raise NotImplementedError()
+
+    def get_file(self, request, path):
+        raise NotImplementedError()
+
+
+class FileSystemUserStorageProvider(UserStorageProvider):
+    def dir_exists(self, request, path):
+        return _Datastore().dir_exists(request.user.username, path)
+
+    def listdir(self, request, path):
+        datastore = _Datastore()
+        if datastore.dir_exists(request.user.username, path):
+            directories, files = datastore.list_user_dir(
+                request.user.username, path)
+            directories_data = []
+            for d in directories:
+                dpath = os.path.join(path, d)
+                created_time = datastore.get_created_time(
+                    request.user.username, dpath)
+                size = datastore.size(request.user.username, dpath)
+                directories_data.append(
+                    {
+                        "name": d,
+                        "path": dpath,
+                        "created_time": created_time,
+                        "size": size,
+                        "hidden": dpath == TMP_INPUT_FILE_UPLOAD_DIR,
+                    }
+                )
+            files_data = []
+            for f in files:
+                user_rel_path = os.path.join(path, f)
+                if not datastore.exists(request.user.username, user_rel_path):
+                    logger.warning(f"listdir skipping {request.user.username}:{user_rel_path}, "
+                                   "does not exist (broken symlink?)")
+                    continue
+                created_time = datastore.get_created_time(
+                    request.user.username, user_rel_path
+                )
+                size = datastore.size(request.user.username, user_rel_path)
+                full_path = datastore.path(request.user.username, user_rel_path)
+                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,
+                        "path": user_rel_path,
+                        "data-product-uri": data_product_uri,
+                        "created_time": created_time,
+                        "mime_type": mime_type,
+                        "size": size,
+                        "hidden": False,
+                    }
+                )
+            return directories_data, files_data
+        else:
+            raise ObjectDoesNotExist("User storage path does not exist")
+
+    def get_file(self, request, path):
+
+        if _is_remote_api():
+            resp = _call_remote_api(request,
+                                    "/user-storage/~/{path}",
+                                    path_params={"path": path},
+                                    raise_for_status=False
+                                    )
+            _raise_404(resp, "User storage file path does not exist")
+            data = resp.json()
+            if data["isDir"]:
+                raise Exception("User storage path is a directory, not a file")
+            file = data['files'][0]
+            file['created_time'] = convert_iso8601_to_datetime(file['createdTime'])
+            file['mime_type'] = file['mimeType']
+            file['data-product-uri'] = file['dataProductURI']
+            return file
+        datastore = _Datastore()
+        if datastore.exists(request.user.username, path):
+            created_time = datastore.get_created_time(
+                request.user.username, path)
+            size = datastore.size(request.user.username, path)
+            full_path = datastore.path(request.user.username, path)
+            data_product_uri = _get_data_product_uri(request, full_path)
+            dir_path, file_name = os.path.split(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']
+
+            return {
+                'name': full_path,
+                'path': dir_path,
+                'data-product-uri': data_product_uri,
+                'created_time': created_time,
+                'mime_type': mime_type,
+                'size': size,
+                'hidden': False
+            }
+        else:
+            raise ObjectDoesNotExist("User storage file path does not exist")
+
+
+class MFTApiUserStorageProvider(UserStorageProvider):
+    def __init__(self) -> None:
+        super().__init__()
+
+    def dir_exists(self, request, path):
+        with grpc.insecure_channel('localhost:7004') as channel:
+            # remove trailing slash and figure out parent path
+            # FIXME remove the hard coded /tmp path
+            parent_path, child_path = os.path.split(f"/tmp/{path}".rstrip("/"))
+            logger.debug(f"parent_path={parent_path}, child_path={child_path}")
+            stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+            # Get metadata for parent directory and see if child_path exists
+            request = MFTApi_pb2.FetchResourceMetadataRequest(
+                resourceId="remote-ssh-dir-resource",
+                resourceType="SCP",
+                resourceToken="local-ssh-cred",
+                resourceBackend="FILE",
+                resourceCredentialBackend="FILE",
+                targetAgentId="agent0",
+                childPath=parent_path,
+                mftAuthorizationToken="user token")
+            response = stub.getDirectoryResourceMetadata(request)
+            # if not child_path, then return True since the response was
+            # successful and we just need to confirm the existence of the root dir
+            if child_path == '':
+                return True
+            return child_path in map(lambda f: f.friendlyName, response.directories)
+
+    def listdir(self, request, path):
+        # TODO setup resourceId, etc from __init__ arguments
+        channel = grpc.insecure_channel('localhost:7004')
+        stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+        request = MFTApi_pb2.FetchResourceMetadataRequest(
+            resourceId="remote-ssh-dir-resource",
+            resourceType="SCP",
+            resourceToken="local-ssh-cred",
+            resourceBackend="FILE",
+            resourceCredentialBackend="FILE",
+            targetAgentId="agent0",
+            childPath=f"/tmp/{path}",
+            mftAuthorizationToken="user token")
+        response = stub.getDirectoryResourceMetadata(request)
+        directories_data = []
+        for d in response.directories:
+
+            dpath = os.path.join(path, d.friendlyName)
+            created_time = datetime.fromtimestamp(d.createdTime)
+            # TODO MFT API doesn't report size
+            size = 0
+            directories_data.append(
+                {
+                    "name": d.friendlyName,
+                    "path": dpath,
+                    "created_time": created_time,
+                    "size": size,
+                    # TODO how to handle hidden directories or directories for
+                    # staging input file uploads
+                    "hidden": False
+                }
+            )
+        files_data = []
+        for f in response.files:
+            user_rel_path = os.path.join(path, f.friendlyName)
+            # TODO do we need to check for broken symlinks?
+            created_time = datetime.fromtimestamp(f.createdTime)
+            # TODO get the size as well
+            size = 0
+            # 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,
+                    "data-product-uri": None,
+                    "created_time": created_time,
+                    "mime_type": None,
+                    "size": size,
+                    "hidden": False,
+                }
+            )
+        return directories_data, files_data
+
+    def get_file(self, request, path):
+        # FIXME remove hard coded /tmp path
+        path = f"/tmp/{path}".rstrip("/")
+        file_metadata = self._get_file(path)
+        if file_metadata is not None:
+            user_rel_path = os.path.join(path, file_metadata.friendlyName)
+            created_time = datetime.fromtimestamp(file_metadata.createdTime)
+            # TODO get the size as well
+            size = 0
+
+            return {
+                "name": file_metadata.friendlyName,
+                "path": user_rel_path,
+                "data-product-uri": None,
+                "created_time": created_time,
+                "mime_type": None,
+                "size": size,
+                "hidden": False,
+            }
+        else:
+            raise ObjectDoesNotExist("User storage file path does not exist")
+
+    def _get_file(self, path):
+        with grpc.insecure_channel('localhost:7004') as channel:
+            stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+            # Get metadata for parent directory and see if child_path exists
+            request = MFTApi_pb2.FetchResourceMetadataRequest(
+                resourceId="remote-ssh-dir-resource",
+                resourceType="SCP",
+                resourceToken="local-ssh-cred",
+                resourceBackend="FILE",
+                resourceCredentialBackend="FILE",
+                targetAgentId="agent0",
+                childPath=path,
+                mftAuthorizationToken="user token")
+            try:
+                # TODO is there a better way to check if file exists than catching exception?
+                return stub.getFileResourceMetadata(request)
+            except Exception:
+                logger.exception(f"_get_file({path})")
+                return None
+
+    def _get_download_url(self, path):
+
+        with grpc.insecure_channel('localhost:7004') as channel:
+            stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+            download_request = MFTApi_pb2.HttpDownloadApiRequest(sourceStoreId="remote-ssh-storage",
+                                                                 sourcePath="/tmp/a.txt",
+                                                                 sourceToken="local-ssh-cred",
+                                                                 sourceType="SCP",
+                                                                 targetAgent="agent0",
+                                                                 mftAuthorizationToken="")
+            try:
+                # TODO is there a better way to check if file exists than catching exception?
+                # response stub.submitHttpDownload(request)
+                pass
+            except Exception:
+                logger.exception(f"_get_file({path})")
+                return None
diff --git a/airavata_django_portal_sdk/user_storage_provider.py b/airavata_django_portal_sdk/user_storage_provider.py
new file mode 100644
index 0000000..cc214db
--- /dev/null
+++ b/airavata_django_portal_sdk/user_storage_provider.py
@@ -0,0 +1,160 @@
+import logging
+import os
+from datetime import datetime
+
+import grpc
+from django.core.exceptions import ObjectDoesNotExist
+
+from . import MFTApi_pb2, MFTApi_pb2_grpc
+# from .user_storage import (TMP_INPUT_FILE_UPLOAD_DIR, _Datastore,
+#                            _get_data_product_uri)
+
+logger = logging.getLogger(__name__)
+
+
+class UserStorageProvider:
+    def __init__(self, authz_token, *args, **kwargs):
+        self.authz_token = authz_token
+
+    def save(self, authz_token, path, file, name=None, content_type=None):
+        raise NotImplementedError()
+
+    def get_upload_url(self, authz_token, path):
+        raise NotImplementedError()
+
+    def open(self, authz_token, resource_id=None):
+        raise NotImplementedError()
+
+    def get_download_url(self, authz_token, resource_id=None):
+        raise NotImplementedError()
+
+    def exists(self, authz_token, resource_id=None):
+        raise NotImplementedError()
+
+    def is_file(self, authz_token, resource_id=None):
+        # TODO: is this needed if we have get_metadata?
+        raise NotImplementedError()
+
+    def is_dir(self, authz_token, resource_id=None):
+        # TODO: is this needed if we have get_metadata?
+        raise NotImplementedError()
+
+    def get_metadata(self, authz_token, resource_id=None):
+        raise NotImplementedError()
+
+    def delete(self, authz_token, resource_id=None):
+        raise NotImplementedError()
+
+    def update(self, authz_token, resource_id, file):
+        raise NotImplementedError()
+
+
+class FileSystemUserStorageProvider(UserStorageProvider):
+    def listdir(self, request, path):
+        datastore = _Datastore()
+        if datastore.dir_exists(request.user.username, path):
+            directories, files = datastore.list_user_dir(
+                request.user.username, path)
+            directories_data = []
+            for d in directories:
+                dpath = os.path.join(path, d)
+                created_time = datastore.get_created_time(
+                    request.user.username, dpath)
+                size = datastore.size(request.user.username, dpath)
+                directories_data.append(
+                    {
+                        "name": d,
+                        "path": dpath,
+                        "created_time": created_time,
+                        "size": size,
+                        "hidden": dpath == TMP_INPUT_FILE_UPLOAD_DIR,
+                    }
+                )
+            files_data = []
+            for f in files:
+                user_rel_path = os.path.join(path, f)
+                if not datastore.exists(request.user.username, user_rel_path):
+                    logger.warning(f"listdir skipping {request.user.username}:{user_rel_path}, "
+                                   "does not exist (broken symlink?)")
+                    continue
+                created_time = datastore.get_created_time(
+                    request.user.username, user_rel_path
+                )
+                size = datastore.size(request.user.username, user_rel_path)
+                full_path = datastore.path(request.user.username, user_rel_path)
+                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,
+                        "path": user_rel_path,
+                        "data-product-uri": data_product_uri,
+                        "created_time": created_time,
+                        "mime_type": mime_type,
+                        "size": size,
+                        "hidden": False,
+                    }
+                )
+            return directories_data, files_data
+        else:
+            raise ObjectDoesNotExist("User storage path does not exist")
+
+
+class MFTApiUserStorageProvider(UserStorageProvider):
+    def __init__(self) -> None:
+        super().__init__()
+
+    def dir_exists(self, path):
+        channel = grpc.insecure_channel('localhost:7004')
+        stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+        request = MFTApi_pb2.FetchResourceMetadataRequest(
+            resourceId="remote-ssh-dir-resource",
+            resourceType="SCP",
+            resourceToken="local-ssh-cred",
+            resourceBackend="FILE",
+            resourceCredentialBackend="FILE",
+            targetAgentId="agent0",
+            childPath=path,
+            mftAuthorizationToken="user token")
+        response = stub.getDirectoryResourceMetadata(request)
+
+    def listdir(self, request, path):
+        # TODO setup resourceId, etc from __init__ arguments
+        channel = grpc.insecure_channel('localhost:7004')
+        stub = MFTApi_pb2_grpc.MFTApiServiceStub(channel)
+        request = MFTApi_pb2.FetchResourceMetadataRequest(
+            resourceId="remote-ssh-dir-resource",
+            resourceType="SCP",
+            resourceToken="local-ssh-cred",
+            resourceBackend="FILE",
+            resourceCredentialBackend="FILE",
+            targetAgentId="agent0",
+            childPath=path,
+            mftAuthorizationToken="user token")
+        response = stub.getDirectoryResourceMetadata(request)
+        directories_data = []
+        for d in response.directories:
+
+            dpath = os.path.join(path, d.friendlyName)
+            created_time = datetime.fromtimestamp(d.createdTime)
+            # TODO MFT API doesn't report size
+            size = 0
+            directories_data.append(
+                {
+                    "name": d.friendlyName,
+                    "path": dpath,
+                    "created_time": created_time,
+                    "size": size,
+                    # TODO how to handle hidden directories or directories for
+                    # staging input file uploads
+                    "hidden": False
+                }
+            )
+        # TODO implement
+        files_data = []
+        return directories_data, files_data
diff --git a/requirements.txt b/requirements.txt
index 6866bc1..62b1685 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,18 +1,21 @@
 bcrypt==3.1.7
 cffi==1.14.1
 cryptography==3.0
-Django==1.11.29
+Django==2.2.17
+google-api-python-client==1.12.8
+grpcio-tools==1.34.1
+grpcio==1.34.1
 oauthlib==3.1.0
 paramiko==2.7.1
 pycparser==2.20
 PyNaCl==1.4.0
 pysftp==0.2.9
 pytz==2020.1
-requests==2.13.0
 requests-oauthlib==0.7.0
+requests==2.18.4
 scp==0.13.2
 six==1.15.0
-thrift==0.10.0
 thrift-connector==0.24
+thrift==0.10.0
 
 -e git+https://github.com/apache/airavata.git@develop#egg=airavata_python_sdk&subdirectory=airavata-api/airavata-client-sdks/airavata-python-sdk