You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2023/02/02 18:25:58 UTC

[airavata-mft] 05/05: Refactoring Swift transport to support auth V3

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

dimuthuupe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-mft.git

commit 8aa069fc99cf66999e2a79d7cedfb7cc5ffe7bf0
Author: Dimuthu Wannipurage <di...@gmail.com>
AuthorDate: Thu Feb 2 13:25:46 2023 -0500

    Refactoring Swift transport to support auth V3
---
 python-cli/README.md                               |   2 +-
 .../mft_cli/airavata_mft_cli/storage/__init__.py   |   3 +
 .../mft_cli/airavata_mft_cli/storage/swift.py      |  82 +++++++++++++
 python-cli/mft_cli/pyproject.toml                  |   3 +-
 python-sdk/setup.cfg                               |   8 +-
 python-sdk/src/airavata_mft_sdk/mft_client.py      |   4 +
 .../airavata_mft_sdk/swift/SwiftCredential_pb2.py  |  58 ++++-----
 .../src/airavata_mft_sdk/swift/SwiftStorage_pb2.py |  36 +++---
 .../backend/sql/entity/SwiftStorageEntity.java     |  21 ----
 .../stub/src/main/proto/swift/SwiftStorage.proto   |   6 -
 .../server/backend/sql/SQLSecretBackend.java       |  79 ++++++------
 .../sql/entity/swift/SwiftSecretEntity.java        |  14 ++-
 ...retEntity.java => SwiftV2AuthSecretEntity.java} |  46 +++----
 ...retEntity.java => SwiftV3AuthSecretEntity.java} |  60 ++++++++--
 ...itory.java => SwiftV2AuthSecretRepository.java} |   6 +-
 ...itory.java => SwiftV3AuthSecretRepository.java} |   6 +-
 .../src/main/proto/swift/SwiftCredential.proto     |  38 +++---
 .../transport/swift/SwiftIncomingConnector.java    |  32 +----
 .../transport/swift/SwiftMetadataCollector.java    | 133 ++++++++++-----------
 .../transport/swift/SwiftOutgoingConnector.java    |  29 +----
 .../airavata/mft/transport/swift/SwiftUtil.java    |  68 +++++++++++
 21 files changed, 423 insertions(+), 311 deletions(-)

diff --git a/python-cli/README.md b/python-cli/README.md
index b941fe5..b076417 100644
--- a/python-cli/README.md
+++ b/python-cli/README.md
@@ -37,7 +37,7 @@ Install dependencies
 ```
 pip install grpcio==1.46.3
 pip install grpcio-tools==1.46.3
-pip install airavata_mft_sdk==0.0.1-alpha21
+pip install airavata_mft_sdk==0.0.1-alpha24
 ```
 
 Build the binary
diff --git a/python-cli/mft_cli/airavata_mft_cli/storage/__init__.py b/python-cli/mft_cli/airavata_mft_cli/storage/__init__.py
index e7ba957..c125b96 100644
--- a/python-cli/mft_cli/airavata_mft_cli/storage/__init__.py
+++ b/python-cli/mft_cli/airavata_mft_cli/storage/__init__.py
@@ -21,6 +21,7 @@ from pick import pick
 import airavata_mft_cli.storage.s3 as s3
 import airavata_mft_cli.storage.azure as azure
 import airavata_mft_cli.storage.gcs as gcs
+import airavata_mft_cli.storage.swift as swift
 from airavata_mft_sdk import mft_client
 from airavata_mft_sdk.common import StorageCommon_pb2
 from rich.console import Console
@@ -39,6 +40,8 @@ def add_storage():
         azure.handle_add_storage()
     elif option == "Google Cloud Storage (GCS)":
         gcs.handle_add_storage()
+    elif option == "Openstack SWIFT":
+        swift.handle_add_storage()
 
 @app.command("list")
 def list_storage():
diff --git a/python-cli/mft_cli/airavata_mft_cli/storage/swift.py b/python-cli/mft_cli/airavata_mft_cli/storage/swift.py
new file mode 100644
index 0000000..0bdf5fc
--- /dev/null
+++ b/python-cli/mft_cli/airavata_mft_cli/storage/swift.py
@@ -0,0 +1,82 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+from rich import print
+from pick import pick
+import typer
+from airavata_mft_sdk import mft_client
+from airavata_mft_sdk.swift import SwiftCredential_pb2
+from airavata_mft_sdk.swift import SwiftStorage_pb2
+from airavata_mft_sdk.common import StorageCommon_pb2
+
+def handle_add_storage():
+
+    options = ["v3", "v2" ]
+    option, index = pick(options, "Select Keystone Auth Version", indicator="=>")
+
+    secret_create_req= SwiftCredential_pb2.SwiftSecretCreateRequest()
+    if (option == "v3"):
+
+        user_name = typer.prompt("User Name")
+        password = typer.prompt("Password")
+        tenant_name = typer.prompt("Tenant Name")
+        project_domain = typer.prompt("Project Domain Name", "Default")
+        user_domain = typer.prompt("User Domain Name", "Default")
+        v3_sec = SwiftCredential_pb2.SwiftV3AuthSecret(userDomainName=user_domain, userName=user_name,
+                                              password=password, tenantName=tenant_name, projectDomainName=project_domain)
+        secret_create_req.v3AuthSecret.CopyFrom(v3_sec)
+    else :
+        tenant_name = typer.prompt("Tenant Name")
+        user_name = typer.prompt("User Name")
+        password = typer.prompt("Password")
+        v2_sec = SwiftCredential_pb2.SwiftV2AuthSecret(tenant=tenant_name, userName=user_name, password=password)
+        secret_create_req.v2AuthSecret.CopyFrom(v2_sec)
+
+
+    auth_url = typer.prompt("Auth URL")
+    secret_create_req.endpoint = auth_url
+
+    region_name = typer.prompt("Region Name")
+    container = typer.prompt("Container")
+
+    storage_name = typer.prompt("Name of the storage ", container)
+
+    client = mft_client.MFTClient(transfer_api_port = 7003,
+                                  transfer_api_secured = False,
+                                  resource_service_host = "localhost",
+                                  resource_service_port = 7003,
+                                  resource_service_secured = False,
+                                  secret_service_host = "localhost",
+                                  secret_service_port = 7003)
+
+
+    swift_storage_create_req = SwiftStorage_pb2.SwiftStorageCreateRequest(region=region_name,
+                                                                          container=container,
+                                                                          name=storage_name)
+
+    created_storage = client.swift_storage_api.createSwiftStorage(swift_storage_create_req)
+
+    created_secret = client.swift_secret_api.createSwiftSecret(secret_create_req)
+
+    secret_for_storage_req = StorageCommon_pb2.SecretForStorage(storageId = created_storage.storageId,
+                                                                secretId = created_secret.secretId,
+                                                                storageType = StorageCommon_pb2.StorageType.SWIFT)
+
+    client.common_api.registerSecretForStorage(secret_for_storage_req)
+
+    print("Successfully added the Swift Container...")
\ No newline at end of file
diff --git a/python-cli/mft_cli/pyproject.toml b/python-cli/mft_cli/pyproject.toml
index 8591b95..83f46f0 100644
--- a/python-cli/mft_cli/pyproject.toml
+++ b/python-cli/mft_cli/pyproject.toml
@@ -32,8 +32,7 @@ typer = {extras = ["all"], version = "^0.7.0"}
 pick = {version= "2.2.0"}
 grpcio= [{version="1.46.3", markers = "platform_machine != 'arm64'"},{version="1.47.0rc1", markers = "platform_machine == 'arm64'"}]
 grpcio-tools = [{version="1.46.3", markers = "platform_machine != 'arm64'"},{version="1.47.0rc1", markers = "platform_machine == 'arm64'"}]
-airavata_mft_sdk= {version="0.0.1-alpha21"}
-
+airavata_mft_sdk= {version="0.0.1-alpha24"}
 
 [build-system]
 requires = ["poetry-core"]
diff --git a/python-sdk/setup.cfg b/python-sdk/setup.cfg
index b05fadd..519de26 100644
--- a/python-sdk/setup.cfg
+++ b/python-sdk/setup.cfg
@@ -16,7 +16,7 @@
 # under the License.
 [metadata]
 name = airavata_mft_sdk
-version = 0.0.1-alpha21
+version = 0.0.1-alpha24
 author = Airavata MFT Developers
 author_email = dev@airavata.apache.org
 description = Python SDK for Apache Airavata Managed File Transfers (MFT)
@@ -35,9 +35,9 @@ package_dir =
 packages = find:
 python_requires = >=3.6
 install_requires=
-    grpcio>='1.44.0'
-    grpcio-tools>='1.44.0'
-    google-api-python-client>='2.0.0'
+    grpcio>=1.44.0
+    grpcio-tools>=1.44.0
+    google-api-python-client>=2.0.0
 
 [options.packages.find]
 where = src
\ No newline at end of file
diff --git a/python-sdk/src/airavata_mft_sdk/mft_client.py b/python-sdk/src/airavata_mft_sdk/mft_client.py
index 4463263..ca5c326 100644
--- a/python-sdk/src/airavata_mft_sdk/mft_client.py
+++ b/python-sdk/src/airavata_mft_sdk/mft_client.py
@@ -7,6 +7,7 @@ from airavata_mft_sdk.ftp import FTPStorageService_pb2_grpc
 from airavata_mft_sdk.gcs import GCSStorageService_pb2_grpc
 from airavata_mft_sdk.local import LocalStorageService_pb2_grpc
 from airavata_mft_sdk.s3 import S3StorageService_pb2_grpc
+from airavata_mft_sdk.swift import SwiftStorageService_pb2_grpc
 from airavata_mft_sdk.scp import SCPStorageService_pb2_grpc
 from airavata_mft_sdk.common import StorageCommon_pb2_grpc
 
@@ -17,6 +18,7 @@ from airavata_mft_sdk.dropbox import DropboxSecretService_pb2_grpc
 from airavata_mft_sdk.ftp import FTPSecretService_pb2_grpc
 from airavata_mft_sdk.gcs import GCSSecretService_pb2_grpc
 from airavata_mft_sdk.s3 import S3SecretService_pb2_grpc
+from airavata_mft_sdk.swift import SwiftSecretService_pb2_grpc
 from airavata_mft_sdk.scp import SCPSecretService_pb2_grpc
 
 class MFTClient:
@@ -47,6 +49,7 @@ class MFTClient:
         self.local_storage_api = LocalStorageService_pb2_grpc.LocalStorageServiceStub(self.resource_channel)
         self.s3_storage_api = S3StorageService_pb2_grpc.S3StorageServiceStub(self.resource_channel)
         self.scp_storage_api = SCPStorageService_pb2_grpc.SCPStorageServiceStub(self.resource_channel)
+        self.swift_storage_api = SwiftStorageService_pb2_grpc.SwiftStorageServiceStub(self.resource_channel)
         self.common_api = StorageCommon_pb2_grpc.StorageCommonServiceStub(self.resource_channel)
 
         if (not secret_service_secured):
@@ -58,6 +61,7 @@ class MFTClient:
         self.ftp_secret_api = FTPSecretService_pb2_grpc.FTPSecretServiceStub(self.secret_channel)
         self.gcs_secret_api = GCSSecretService_pb2_grpc.GCSSecretServiceStub(self.secret_channel)
         self.s3_secret_api = S3SecretService_pb2_grpc.S3SecretServiceStub(self.secret_channel)
+        self.swift_secret_api = SwiftSecretService_pb2_grpc.SwiftSecretServiceStub(self.secret_channel)
         self.scp_secret_api = SCPSecretService_pb2_grpc.SCPSecretServiceStub(self.secret_channel)
 
 
diff --git a/python-sdk/src/airavata_mft_sdk/swift/SwiftCredential_pb2.py b/python-sdk/src/airavata_mft_sdk/swift/SwiftCredential_pb2.py
index e7580a0..9717b6f 100644
--- a/python-sdk/src/airavata_mft_sdk/swift/SwiftCredential_pb2.py
+++ b/python-sdk/src/airavata_mft_sdk/swift/SwiftCredential_pb2.py
@@ -15,12 +15,12 @@ _sym_db = _symbol_database.Default()
 import airavata_mft_sdk.CredCommon_pb2 as CredCommon__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bswift/SwiftCredential.proto\x12.org.apache.airavata.mft.credential.stubs.swift\x1a\x10\x43redCommon.proto\"^\n\x13SwiftPasswordSecret\x12\x10\n\x08userName\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x11\n\tprojectId\x18\x03 \x01(\t\x12\x10\n\x08\x64omainId\x18\x04 \x01(\t\"K\n\x19SwiftAuthCredentialSecret\x12\x14\n\x0c\x63redentialId\x18\x01 \x01(\t\x12\x18\n\x10\x63redentialSecret\x18\x02 \x01(\t\"\xf3\x01\ [...]
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bswift/SwiftCredential.proto\x12.org.apache.airavata.mft.credential.stubs.swift\x1a\x10\x43redCommon.proto\"G\n\x11SwiftV2AuthSecret\x12\x0e\n\x06tenant\x18\x01 \x01(\t\x12\x10\n\x08userName\x18\x02 \x01(\t\x12\x10\n\x08password\x18\x03 \x01(\t\"~\n\x11SwiftV3AuthSecret\x12\x16\n\x0euserDomainName\x18\x01 \x01(\t\x12\x10\n\x08userName\x18\x02 \x01(\t\x12\x10\n\x08password\x18\x03 \x01(\t\x12\x12\n\ntenantName\x18\x04 \x01(\ [...]
 
 
 
-_SWIFTPASSWORDSECRET = DESCRIPTOR.message_types_by_name['SwiftPasswordSecret']
-_SWIFTAUTHCREDENTIALSECRET = DESCRIPTOR.message_types_by_name['SwiftAuthCredentialSecret']
+_SWIFTV2AUTHSECRET = DESCRIPTOR.message_types_by_name['SwiftV2AuthSecret']
+_SWIFTV3AUTHSECRET = DESCRIPTOR.message_types_by_name['SwiftV3AuthSecret']
 _SWIFTSECRET = DESCRIPTOR.message_types_by_name['SwiftSecret']
 _SWIFTSECRETGETREQUEST = DESCRIPTOR.message_types_by_name['SwiftSecretGetRequest']
 _SWIFTSECRETCREATEREQUEST = DESCRIPTOR.message_types_by_name['SwiftSecretCreateRequest']
@@ -28,19 +28,19 @@ _SWIFTSECRETUPDATEREQUEST = DESCRIPTOR.message_types_by_name['SwiftSecretUpdateR
 _SWIFTSECRETUPDATERESPONSE = DESCRIPTOR.message_types_by_name['SwiftSecretUpdateResponse']
 _SWIFTSECRETDELETEREQUEST = DESCRIPTOR.message_types_by_name['SwiftSecretDeleteRequest']
 _SWIFTSECRETDELETERESPONSE = DESCRIPTOR.message_types_by_name['SwiftSecretDeleteResponse']
-SwiftPasswordSecret = _reflection.GeneratedProtocolMessageType('SwiftPasswordSecret', (_message.Message,), {
-  'DESCRIPTOR' : _SWIFTPASSWORDSECRET,
+SwiftV2AuthSecret = _reflection.GeneratedProtocolMessageType('SwiftV2AuthSecret', (_message.Message,), {
+  'DESCRIPTOR' : _SWIFTV2AUTHSECRET,
   '__module__' : 'swift.SwiftCredential_pb2'
-  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.credential.stubs.swift.SwiftPasswordSecret)
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.credential.stubs.swift.SwiftV2AuthSecret)
   })
-_sym_db.RegisterMessage(SwiftPasswordSecret)
+_sym_db.RegisterMessage(SwiftV2AuthSecret)
 
-SwiftAuthCredentialSecret = _reflection.GeneratedProtocolMessageType('SwiftAuthCredentialSecret', (_message.Message,), {
-  'DESCRIPTOR' : _SWIFTAUTHCREDENTIALSECRET,
+SwiftV3AuthSecret = _reflection.GeneratedProtocolMessageType('SwiftV3AuthSecret', (_message.Message,), {
+  'DESCRIPTOR' : _SWIFTV3AUTHSECRET,
   '__module__' : 'swift.SwiftCredential_pb2'
-  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.credential.stubs.swift.SwiftAuthCredentialSecret)
+  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.credential.stubs.swift.SwiftV3AuthSecret)
   })
-_sym_db.RegisterMessage(SwiftAuthCredentialSecret)
+_sym_db.RegisterMessage(SwiftV3AuthSecret)
 
 SwiftSecret = _reflection.GeneratedProtocolMessageType('SwiftSecret', (_message.Message,), {
   'DESCRIPTOR' : _SWIFTSECRET,
@@ -95,22 +95,22 @@ if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'P\001'
-  _SWIFTPASSWORDSECRET._serialized_start=97
-  _SWIFTPASSWORDSECRET._serialized_end=191
-  _SWIFTAUTHCREDENTIALSECRET._serialized_start=193
-  _SWIFTAUTHCREDENTIALSECRET._serialized_end=268
-  _SWIFTSECRET._serialized_start=271
-  _SWIFTSECRET._serialized_end=514
-  _SWIFTSECRETGETREQUEST._serialized_start=516
-  _SWIFTSECRETGETREQUEST._serialized_end=620
-  _SWIFTSECRETCREATEREQUEST._serialized_start=623
-  _SWIFTSECRETCREATEREQUEST._serialized_end=924
-  _SWIFTSECRETUPDATEREQUEST._serialized_start=927
-  _SWIFTSECRETUPDATEREQUEST._serialized_end=1246
-  _SWIFTSECRETUPDATERESPONSE._serialized_start=1248
-  _SWIFTSECRETUPDATERESPONSE._serialized_end=1293
-  _SWIFTSECRETDELETEREQUEST._serialized_start=1295
-  _SWIFTSECRETDELETEREQUEST._serialized_end=1402
-  _SWIFTSECRETDELETERESPONSE._serialized_start=1404
-  _SWIFTSECRETDELETERESPONSE._serialized_end=1447
+  _SWIFTV2AUTHSECRET._serialized_start=97
+  _SWIFTV2AUTHSECRET._serialized_end=168
+  _SWIFTV3AUTHSECRET._serialized_start=170
+  _SWIFTV3AUTHSECRET._serialized_end=296
+  _SWIFTSECRET._serialized_start=299
+  _SWIFTSECRET._serialized_end=540
+  _SWIFTSECRETGETREQUEST._serialized_start=542
+  _SWIFTSECRETGETREQUEST._serialized_end=646
+  _SWIFTSECRETCREATEREQUEST._serialized_start=649
+  _SWIFTSECRETCREATEREQUEST._serialized_end=948
+  _SWIFTSECRETUPDATEREQUEST._serialized_start=951
+  _SWIFTSECRETUPDATEREQUEST._serialized_end=1268
+  _SWIFTSECRETUPDATERESPONSE._serialized_start=1270
+  _SWIFTSECRETUPDATERESPONSE._serialized_end=1315
+  _SWIFTSECRETDELETEREQUEST._serialized_start=1317
+  _SWIFTSECRETDELETEREQUEST._serialized_end=1424
+  _SWIFTSECRETDELETERESPONSE._serialized_start=1426
+  _SWIFTSECRETDELETERESPONSE._serialized_end=1469
 # @@protoc_insertion_point(module_scope)
diff --git a/python-sdk/src/airavata_mft_sdk/swift/SwiftStorage_pb2.py b/python-sdk/src/airavata_mft_sdk/swift/SwiftStorage_pb2.py
index e6af4c6..6863413 100644
--- a/python-sdk/src/airavata_mft_sdk/swift/SwiftStorage_pb2.py
+++ b/python-sdk/src/airavata_mft_sdk/swift/SwiftStorage_pb2.py
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18swift/SwiftStorage.proto\x12\x34org.apache.airavata.mft.resource.stubs.swift.storage\"}\n\x0cSwiftStorage\x12\x11\n\tstorageId\x18\x01 \x01(\t\x12\x11\n\tcontainer\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x04 \x01(\t\x12\x0e\n\x06region\x18\x05 \x01(\t\x12\x17\n\x0fkeystoneVersion\x18\x06 \x01(\x05\"8\n\x17SwiftStorageListRequest\x12\x0e\n\x06offset\x18\x01 \x01(\x05\x12\r\n\x05limit\x [...]
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18swift/SwiftStorage.proto\x12\x34org.apache.airavata.mft.resource.stubs.swift.storage\"R\n\x0cSwiftStorage\x12\x11\n\tstorageId\x18\x01 \x01(\t\x12\x11\n\tcontainer\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06region\x18\x05 \x01(\t\"8\n\x17SwiftStorageListRequest\x12\x0e\n\x06offset\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\"p\n\x18SwiftStorageListResponse\x12T\n\x08storages\x18\x01 \x03(\x0b\x [...]
 
 
 
@@ -95,21 +95,21 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'P\001'
   _SWIFTSTORAGE._serialized_start=82
-  _SWIFTSTORAGE._serialized_end=207
-  _SWIFTSTORAGELISTREQUEST._serialized_start=209
-  _SWIFTSTORAGELISTREQUEST._serialized_end=265
-  _SWIFTSTORAGELISTRESPONSE._serialized_start=267
-  _SWIFTSTORAGELISTRESPONSE._serialized_end=379
-  _SWIFTSTORAGEGETREQUEST._serialized_start=381
-  _SWIFTSTORAGEGETREQUEST._serialized_end=424
-  _SWIFTSTORAGECREATEREQUEST._serialized_start=427
-  _SWIFTSTORAGECREATEREQUEST._serialized_end=565
-  _SWIFTSTORAGEUPDATEREQUEST._serialized_start=568
-  _SWIFTSTORAGEUPDATEREQUEST._serialized_end=706
-  _SWIFTSTORAGEUPDATERESPONSE._serialized_start=708
-  _SWIFTSTORAGEUPDATERESPONSE._serialized_end=755
-  _SWIFTSTORAGEDELETEREQUEST._serialized_start=757
-  _SWIFTSTORAGEDELETEREQUEST._serialized_end=803
-  _SWIFTSTORAGEDELETERESPONSE._serialized_start=805
-  _SWIFTSTORAGEDELETERESPONSE._serialized_end=849
+  _SWIFTSTORAGE._serialized_end=164
+  _SWIFTSTORAGELISTREQUEST._serialized_start=166
+  _SWIFTSTORAGELISTREQUEST._serialized_end=222
+  _SWIFTSTORAGELISTRESPONSE._serialized_start=224
+  _SWIFTSTORAGELISTRESPONSE._serialized_end=336
+  _SWIFTSTORAGEGETREQUEST._serialized_start=338
+  _SWIFTSTORAGEGETREQUEST._serialized_end=381
+  _SWIFTSTORAGECREATEREQUEST._serialized_start=383
+  _SWIFTSTORAGECREATEREQUEST._serialized_end=478
+  _SWIFTSTORAGEUPDATEREQUEST._serialized_start=480
+  _SWIFTSTORAGEUPDATEREQUEST._serialized_end=575
+  _SWIFTSTORAGEUPDATERESPONSE._serialized_start=577
+  _SWIFTSTORAGEUPDATERESPONSE._serialized_end=624
+  _SWIFTSTORAGEDELETEREQUEST._serialized_start=626
+  _SWIFTSTORAGEDELETEREQUEST._serialized_end=672
+  _SWIFTSTORAGEDELETERESPONSE._serialized_start=674
+  _SWIFTSTORAGEDELETERESPONSE._serialized_end=718
 # @@protoc_insertion_point(module_scope)
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SwiftStorageEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SwiftStorageEntity.java
index 887c874..4792795 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SwiftStorageEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SwiftStorageEntity.java
@@ -38,15 +38,9 @@ public class SwiftStorageEntity {
     @Column(name = "CONTAINER")
     String container;
 
-    @Column(name = "ENDPOINT")
-    String endpoint;
-
     @Column(name = "REGION")
     String region;
 
-    @Column(name = "KEYSTONE_VERSION")
-    int keystoneVersion;
-
     public String getStorageId() {
         return storageId;
     }
@@ -71,14 +65,6 @@ public class SwiftStorageEntity {
         this.container = container;
     }
 
-    public String getEndpoint() {
-        return endpoint;
-    }
-
-    public void setEndpoint(String endpoint) {
-        this.endpoint = endpoint;
-    }
-
     public String getRegion() {
         return region;
     }
@@ -87,11 +73,4 @@ public class SwiftStorageEntity {
         this.region = region;
     }
 
-    public int getKeystoneVersion() {
-        return keystoneVersion;
-    }
-
-    public void setKeystoneVersion(int keystoneVersion) {
-        this.keystoneVersion = keystoneVersion;
-    }
 }
diff --git a/services/resource-service/stub/src/main/proto/swift/SwiftStorage.proto b/services/resource-service/stub/src/main/proto/swift/SwiftStorage.proto
index 824491e..d621209 100644
--- a/services/resource-service/stub/src/main/proto/swift/SwiftStorage.proto
+++ b/services/resource-service/stub/src/main/proto/swift/SwiftStorage.proto
@@ -24,9 +24,7 @@ message SwiftStorage {
     string storageId = 1;
     string container = 2;
     string name = 3;
-    string endpoint = 4;
     string region = 5;
-    int32 keystoneVersion = 6;
 }
 
 message SwiftStorageListRequest {
@@ -46,18 +44,14 @@ message SwiftStorageCreateRequest {
     string storageId = 1;
     string container = 2;
     string name = 3;
-    string endpoint = 4;
     string region = 5;
-    int32 keystoneVersion = 6;
 }
 
 message SwiftStorageUpdateRequest {
     string storageId = 1;
     string container = 2;
     string name = 3;
-    string endpoint = 4;
     string region = 5;
-    int32 keystoneVersion = 6;
 }
 
 message SwiftStorageUpdateResponse {
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
index d19a1fd..2c08b98 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
@@ -28,12 +28,13 @@ import org.apache.airavata.mft.credential.stubs.scp.*;
 import org.apache.airavata.mft.credential.stubs.swift.*;
 import org.apache.airavata.mft.secret.server.backend.SecretBackend;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.*;
-import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftAuthCredentialSecretEntity;
-import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftPasswordSecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftSecretEntity.InternalSecretType;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftV2AuthSecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftV3AuthSecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftSecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.repository.*;
-import org.apache.airavata.mft.secret.server.backend.sql.repository.swift.SwiftAuthCredentialSecretRepository;
-import org.apache.airavata.mft.secret.server.backend.sql.repository.swift.SwiftPasswordSecretRepository;
+import org.apache.airavata.mft.secret.server.backend.sql.repository.swift.SwiftV2AuthSecretRepository;
+import org.apache.airavata.mft.secret.server.backend.sql.repository.swift.SwiftV3AuthSecretRepository;
 import org.apache.airavata.mft.secret.server.backend.sql.repository.swift.SwiftSecretRepository;
 import org.dozer.DozerBeanMapper;
 import org.slf4j.Logger;
@@ -64,10 +65,10 @@ public class SQLSecretBackend implements SecretBackend {
     private SwiftSecretRepository swiftSecretRepository;
 
     @Autowired
-    private SwiftPasswordSecretRepository swiftPasswordSecretRepository;
+    private SwiftV3AuthSecretRepository swiftV3AuthSecretRepository;
 
     @Autowired
-    private SwiftAuthCredentialSecretRepository swiftAuthCredentialSecretRepository;
+    private SwiftV2AuthSecretRepository swiftV2AuthSecretRepository;
 
     @Autowired
     private ODataSecretRepository odataSecretRepository;
@@ -229,26 +230,27 @@ public class SQLSecretBackend implements SecretBackend {
             SwiftSecret.Builder secBuilder = SwiftSecret.newBuilder();
             SwiftSecretEntity secEty = secEtyOp.get();
             secBuilder.setSecretId(secEty.getSecretId());
+            secBuilder.setEndpoint(secEty.getEndpoint());
 
             switch (secEty.getInternalSecretType()) {
-                case PASSWORD:
-                    Optional<SwiftPasswordSecretEntity> passSec = swiftPasswordSecretRepository
+                case V2:
+                    Optional<SwiftV2AuthSecretEntity> v2Sec = swiftV2AuthSecretRepository
                             .findBySecretId(secEty.getInternalSecretId());
-                    if (passSec.isPresent()) {
-                        SwiftPasswordSecret.Builder passBuilder = SwiftPasswordSecret.newBuilder();
-                        mapper.map(passSec.get(), passBuilder);
-                        secBuilder.setPasswordSecret(passBuilder.build());
+                    if (v2Sec.isPresent()) {
+                        SwiftV2AuthSecret.Builder v2Builder = SwiftV2AuthSecret.newBuilder();
+                        mapper.map(v2Sec.get(), v2Builder);
+                        secBuilder.setV2AuthSecret(v2Builder.build());
                     } else {
                         throw new Exception("Can not find a swift password secret with id " + secEty.getInternalSecretId());
                     }
                     break;
-                case AUTH_CREDENTIAL:
-                    Optional<SwiftAuthCredentialSecretEntity> authCredSec = swiftAuthCredentialSecretRepository
+                case V3:
+                    Optional<SwiftV3AuthSecretEntity> v3Sec = swiftV3AuthSecretRepository
                             .findBySecretId(secEty.getInternalSecretId());
-                    if (authCredSec.isPresent()) {
-                        SwiftAuthCredentialSecret.Builder authBuilder = SwiftAuthCredentialSecret.newBuilder();
-                        mapper.map(authCredSec.get(), authBuilder);
-                        secBuilder.setAuthCredentialSecret(authBuilder.build());
+                    if (v3Sec.isPresent()) {
+                        SwiftV3AuthSecret.Builder v3Builder = SwiftV3AuthSecret.newBuilder();
+                        mapper.map(v3Sec.get(), v3Builder);
+                        secBuilder.setV3AuthSecret(v3Builder.build());
                     } else {
                         throw new Exception("Can not find a swift auth cred secret with id " + secEty.getInternalSecretId());
                     }
@@ -266,21 +268,22 @@ public class SQLSecretBackend implements SecretBackend {
     public SwiftSecret createSwiftSecret(SwiftSecretCreateRequest request) throws Exception {
 
         SwiftSecretEntity secEty = new SwiftSecretEntity();
-        SwiftAuthCredentialSecretEntity authCredSaved = null;
-        SwiftPasswordSecretEntity passSecSaved = null;
+        secEty.setEndpoint(request.getEndpoint());
+        SwiftV2AuthSecretEntity v2SecSaved = null;
+        SwiftV3AuthSecretEntity v3SecSaved = null;
 
         switch (request.getSecretCase()) {
-            case PASSWORDSECRET:
-                passSecSaved = swiftPasswordSecretRepository
-                        .save(mapper.map(request.getPasswordSecret(), SwiftPasswordSecretEntity.class));
-                secEty.setInternalSecretId(passSecSaved.getSecretId());
-                secEty.setInternalSecretType(SwiftSecretEntity.InternalSecretType.PASSWORD);
+            case V2AUTHSECRET:
+                v2SecSaved = swiftV2AuthSecretRepository
+                        .save(mapper.map(request.getV2AuthSecret(), SwiftV2AuthSecretEntity.class));
+                secEty.setInternalSecretId(v2SecSaved.getSecretId());
+                secEty.setInternalSecretType(InternalSecretType.V2);
                 break;
-            case AUTHCREDENTIALSECRET:
-                authCredSaved = swiftAuthCredentialSecretRepository
-                        .save(mapper.map(request.getAuthCredentialSecret(), SwiftAuthCredentialSecretEntity.class));
-                secEty.setInternalSecretId(authCredSaved.getSecretId());
-                secEty.setInternalSecretType(SwiftSecretEntity.InternalSecretType.AUTH_CREDENTIAL);
+            case V3AUTHSECRET:
+                v3SecSaved = swiftV3AuthSecretRepository
+                        .save(mapper.map(request.getV3AuthSecret(), SwiftV3AuthSecretEntity.class));
+                secEty.setInternalSecretId(v3SecSaved.getSecretId());
+                secEty.setInternalSecretType(InternalSecretType.V3);
                 break;
             case SECRET_NOT_SET:
                 throw new Exception("No internal secret is set");
@@ -290,11 +293,11 @@ public class SQLSecretBackend implements SecretBackend {
         SwiftSecret.Builder secBuilder = SwiftSecret.newBuilder();
         secBuilder.setSecretId(savedEty.getSecretId());
         switch (savedEty.getInternalSecretType()) {
-            case PASSWORD:
-                secBuilder.setPasswordSecret(mapper.map(passSecSaved, SwiftPasswordSecret.newBuilder().getClass()));
+            case V2:
+                secBuilder.setV2AuthSecret(mapper.map(v2SecSaved, SwiftV2AuthSecret.newBuilder().getClass()));
                 break;
-            case AUTH_CREDENTIAL:
-                secBuilder.setAuthCredentialSecret(mapper.map(authCredSaved, SwiftAuthCredentialSecret.newBuilder().getClass()));
+            case V3:
+                secBuilder.setV3AuthSecret(mapper.map(v3SecSaved, SwiftV3AuthSecret.newBuilder().getClass()));
                 break;
         }
 
@@ -312,11 +315,11 @@ public class SQLSecretBackend implements SecretBackend {
         if (secOp.isPresent()) {
             swiftSecretRepository.deleteById(request.getSecretId());
             switch (secOp.get().getInternalSecretType()) {
-                case AUTH_CREDENTIAL:
-                    swiftAuthCredentialSecretRepository.deleteById(secOp.get().getInternalSecretId());
+                case V2:
+                    swiftV2AuthSecretRepository.deleteById(secOp.get().getInternalSecretId());
                     break;
-                case PASSWORD:
-                    swiftPasswordSecretRepository.deleteById(secOp.get().getInternalSecretId());
+                case V3:
+                    swiftV3AuthSecretRepository.deleteById(secOp.get().getInternalSecretId());
                     break;
             }
             return true;
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftSecretEntity.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftSecretEntity.java
index 203edec..bec3bd3 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftSecretEntity.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftSecretEntity.java
@@ -28,7 +28,7 @@ import javax.persistence.Id;
 public class SwiftSecretEntity {
 
     public enum InternalSecretType {
-        PASSWORD, AUTH_CREDENTIAL;
+        V2, V3;
     }
 
     @Id
@@ -43,6 +43,9 @@ public class SwiftSecretEntity {
     @Column(name = "INTERNAL_SECRET_TYPE")
     private InternalSecretType internalSecretType;
 
+    @Column(name = "ENDPOINT")
+    private String endpoint;
+
     public String getSecretId() {
         return secretId;
     }
@@ -66,4 +69,13 @@ public class SwiftSecretEntity {
     public void setInternalSecretType(InternalSecretType internalSecretType) {
         this.internalSecretType = internalSecretType;
     }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public SwiftSecretEntity setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+        return this;
+    }
 }
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftPasswordSecretEntity.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV2AuthSecretEntity.java
similarity index 74%
rename from services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftPasswordSecretEntity.java
rename to services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV2AuthSecretEntity.java
index 9157af5..1cccc6a 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftPasswordSecretEntity.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV2AuthSecretEntity.java
@@ -25,7 +25,7 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
 @Entity
-public class SwiftPasswordSecretEntity {
+public class SwiftV2AuthSecretEntity {
 
     @Id
     @Column(name = "SECRET_ID")
@@ -33,17 +33,14 @@ public class SwiftPasswordSecretEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String secretId;
 
+    @Column(name = "TENANT")
+    private String tenant;
+
     @Column(name = "USER_NAME")
-    String userName;
+    private String userName;
 
     @Column(name = "PASSWORD")
-    String password;
-
-    @Column(name = "PROJECT_ID")
-    String projectId;
-
-    @Column(name = "DOMAIN_ID")
-    String domainId;
+    private String password;
 
     public String getSecretId() {
         return secretId;
@@ -53,35 +50,30 @@ public class SwiftPasswordSecretEntity {
         this.secretId = secretId;
     }
 
+    public String getTenant() {
+        return tenant;
+    }
+
+    public SwiftV2AuthSecretEntity setTenant(String tenant) {
+        this.tenant = tenant;
+        return this;
+    }
+
     public String getUserName() {
         return userName;
     }
 
-    public void setUserName(String userName) {
+    public SwiftV2AuthSecretEntity setUserName(String userName) {
         this.userName = userName;
+        return this;
     }
 
     public String getPassword() {
         return password;
     }
 
-    public void setPassword(String password) {
+    public SwiftV2AuthSecretEntity setPassword(String password) {
         this.password = password;
-    }
-
-    public String getProjectId() {
-        return projectId;
-    }
-
-    public void setProjectId(String projectId) {
-        this.projectId = projectId;
-    }
-
-    public String getDomainId() {
-        return domainId;
-    }
-
-    public void setDomainId(String domainId) {
-        this.domainId = domainId;
+        return this;
     }
 }
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftAuthCredentialSecretEntity.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV3AuthSecretEntity.java
similarity index 51%
rename from services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftAuthCredentialSecretEntity.java
rename to services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV3AuthSecretEntity.java
index 7b07f94..af34e42 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftAuthCredentialSecretEntity.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/swift/SwiftV3AuthSecretEntity.java
@@ -25,7 +25,7 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
 @Entity
-public class SwiftAuthCredentialSecretEntity {
+public class SwiftV3AuthSecretEntity {
 
     @Id
     @Column(name = "SECRET_ID")
@@ -33,11 +33,18 @@ public class SwiftAuthCredentialSecretEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String secretId;
 
-    @Column(name = "CREDENTIAL_ID")
-    private String credentialId;
+    @Column(name = "USER_DOMAIN_NAME")
+    private String userDomainName;
+    @Column(name = "USER_NAME")
+    private String userName;
+    @Column(name = "PASSWORD")
+    private String password;
 
-    @Column(name = "CREDENTIAL_SECRET")
-    private String credentialSecret;
+    @Column(name = "TENANT_NAME")
+    private String tenantName;
+
+    @Column(name = "PROJECT_DOMAIN_NAME")
+    private String projectDomainName;
 
     public String getSecretId() {
         return secretId;
@@ -47,19 +54,46 @@ public class SwiftAuthCredentialSecretEntity {
         this.secretId = secretId;
     }
 
-    public String getCredentialId() {
-        return credentialId;
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUserDomainName() {
+        return userDomainName;
+    }
+
+    public SwiftV3AuthSecretEntity setUserDomainName(String userDomainName) {
+        this.userDomainName = userDomainName;
+        return this;
+    }
+
+    public String getTenantName() {
+        return tenantName;
     }
 
-    public void setCredentialId(String credentialId) {
-        this.credentialId = credentialId;
+    public SwiftV3AuthSecretEntity setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+        return this;
     }
 
-    public String getCredentialSecret() {
-        return credentialSecret;
+    public String getProjectDomainName() {
+        return projectDomainName;
     }
 
-    public void setCredentialSecret(String credentialSecret) {
-        this.credentialSecret = credentialSecret;
+    public SwiftV3AuthSecretEntity setProjectDomainName(String projectDomainName) {
+        this.projectDomainName = projectDomainName;
+        return this;
     }
 }
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftAuthCredentialSecretRepository.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV2AuthSecretRepository.java
similarity index 81%
rename from services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftAuthCredentialSecretRepository.java
rename to services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV2AuthSecretRepository.java
index 9cda467..7ca6375 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftAuthCredentialSecretRepository.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV2AuthSecretRepository.java
@@ -17,11 +17,11 @@
 
 package org.apache.airavata.mft.secret.server.backend.sql.repository.swift;
 
-import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftAuthCredentialSecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftV2AuthSecretEntity;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.Optional;
 
-public interface SwiftAuthCredentialSecretRepository extends CrudRepository<SwiftAuthCredentialSecretEntity, String> {
-    Optional<SwiftAuthCredentialSecretEntity> findBySecretId(String secretId);
+public interface SwiftV2AuthSecretRepository extends CrudRepository<SwiftV2AuthSecretEntity, String> {
+    Optional<SwiftV2AuthSecretEntity> findBySecretId(String secretId);
 }
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftPasswordSecretRepository.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV3AuthSecretRepository.java
similarity index 82%
rename from services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftPasswordSecretRepository.java
rename to services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV3AuthSecretRepository.java
index 51ef5b4..1574f70 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftPasswordSecretRepository.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/swift/SwiftV3AuthSecretRepository.java
@@ -17,12 +17,12 @@
 
 package org.apache.airavata.mft.secret.server.backend.sql.repository.swift;
 
-import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftPasswordSecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.swift.SwiftV3AuthSecretEntity;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.Optional;
 
-public interface SwiftPasswordSecretRepository extends CrudRepository<SwiftPasswordSecretEntity, String> {
-    Optional<SwiftPasswordSecretEntity> findBySecretId(String secretId);
+public interface SwiftV3AuthSecretRepository extends CrudRepository<SwiftV3AuthSecretEntity, String> {
+    Optional<SwiftV3AuthSecretEntity> findBySecretId(String secretId);
 
 }
diff --git a/services/secret-service/stub/src/main/proto/swift/SwiftCredential.proto b/services/secret-service/stub/src/main/proto/swift/SwiftCredential.proto
index 02f34d2..0ad6ca7 100644
--- a/services/secret-service/stub/src/main/proto/swift/SwiftCredential.proto
+++ b/services/secret-service/stub/src/main/proto/swift/SwiftCredential.proto
@@ -22,24 +22,27 @@ package org.apache.airavata.mft.credential.stubs.swift;
 
 import "CredCommon.proto";
 
-message SwiftPasswordSecret {
-    string userName = 1;
-    string password = 2;
-    string projectId = 3;
-    string domainId = 4;
+message SwiftV2AuthSecret {
+  string tenant = 1;
+  string userName = 2;
+  string password = 3;
 }
 
-message SwiftAuthCredentialSecret {
-    string credentialId = 1;
-    string credentialSecret = 2;
+message SwiftV3AuthSecret {
+  string userDomainName = 1;
+  string userName = 2;
+  string password = 3;
+  string tenantName = 4;
+  string projectDomainName = 5;
 }
 
 message SwiftSecret {
     string secretId = 1;
     oneof secret {
-        SwiftPasswordSecret passwordSecret = 2;
-        SwiftAuthCredentialSecret authCredentialSecret = 3;
+        SwiftV2AuthSecret v2AuthSecret = 2;
+        SwiftV3AuthSecret v3AuthSecret = 3;
     }
+    string endpoint = 4;
 }
 
 message SwiftSecretGetRequest {
@@ -48,20 +51,23 @@ message SwiftSecretGetRequest {
 }
 
 message SwiftSecretCreateRequest {
+
     oneof secret {
-        SwiftPasswordSecret passwordSecret = 1;
-        SwiftAuthCredentialSecret authCredentialSecret = 2;
+        SwiftV2AuthSecret v2AuthSecret = 1;
+        SwiftV3AuthSecret v3AuthSecret = 2;
     }
-    org.apache.airavata.mft.common.AuthToken authzToken = 3;
+    string endpoint = 3;
+    org.apache.airavata.mft.common.AuthToken authzToken = 4;
 }
 
 message SwiftSecretUpdateRequest {
     string secretId = 1;
     oneof secret {
-        SwiftPasswordSecret passwordSecret = 2;
-        SwiftAuthCredentialSecret authCredentialSecret = 3;
+        SwiftV2AuthSecret v2AuthSecret = 2;
+        SwiftV3AuthSecret v3AuthSecret = 3;
     }
-    org.apache.airavata.mft.common.AuthToken authzToken = 4;
+    string endpoint = 4;
+    org.apache.airavata.mft.common.AuthToken authzToken = 5;
 }
 
 message SwiftSecretUpdateResponse {
diff --git a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftIncomingConnector.java b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftIncomingConnector.java
index e578b5f..5f9a415 100644
--- a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftIncomingConnector.java
+++ b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftIncomingConnector.java
@@ -50,40 +50,10 @@ public class SwiftIncomingConnector implements IncomingChunkedConnector {
     public void init(ConnectorConfig cc) throws Exception {
 
         SwiftStorage swiftStorage = cc.getStorage().getSwift();
-
         this.resourcePath = cc.getResourcePath();
-
         SwiftSecret swiftSecret = cc.getSecret().getSwift();
-
-        String provider = "openstack-swift";
-
-        Properties overrides = new Properties();
-        overrides.put(KeystoneProperties.KEYSTONE_VERSION, swiftStorage.getKeystoneVersion() + "");
-
-        String identity = null;
-        String credential = null;
-        switch (swiftSecret.getSecretCase()) {
-            case PASSWORDSECRET:
-                identity = swiftSecret.getPasswordSecret().getDomainId() + ":" + swiftSecret.getPasswordSecret().getUserName();
-                credential = swiftSecret.getPasswordSecret().getPassword();
-                overrides.put(KeystoneProperties.SCOPE, "projectId:" + swiftSecret.getPasswordSecret().getProjectId());
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
-                break;
-            case AUTHCREDENTIALSECRET:
-                identity = swiftSecret.getAuthCredentialSecret().getCredentialId();
-                credential = swiftSecret.getAuthCredentialSecret().getCredentialSecret();
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.API_ACCESS_KEY_CREDENTIALS);
-                break;
-        }
-
-        swiftApi = ContextBuilder.newBuilder(provider)
-                .endpoint(swiftStorage.getEndpoint())
-                .credentials(identity, credential)
-                .overrides(overrides)
-                .buildApi(SwiftApi.class);
-
+        swiftApi = SwiftUtil.createSwiftApi(swiftSecret, swiftStorage);
         objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
-
     }
 
     @Override
diff --git a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftMetadataCollector.java b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftMetadataCollector.java
index b9f33e3..ad4fa85 100644
--- a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftMetadataCollector.java
+++ b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftMetadataCollector.java
@@ -17,14 +17,13 @@
 
 package org.apache.airavata.mft.transport.swift;
 
+import com.google.common.collect.FluentIterable;
 import org.apache.airavata.mft.agent.stub.*;
 import org.apache.airavata.mft.core.api.MetadataCollector;
 import org.apache.airavata.mft.credential.stubs.swift.SwiftSecret;
 import org.apache.airavata.mft.resource.stubs.swift.storage.SwiftStorage;
-import org.jclouds.ContextBuilder;
-import org.jclouds.openstack.keystone.auth.config.CredentialTypes;
-import org.jclouds.openstack.keystone.config.KeystoneProperties;
 import org.jclouds.openstack.swift.v1.SwiftApi;
+import org.jclouds.openstack.swift.v1.domain.Container;
 import org.jclouds.openstack.swift.v1.domain.ObjectList;
 import org.jclouds.openstack.swift.v1.domain.SwiftObject;
 import org.jclouds.openstack.swift.v1.features.ObjectApi;
@@ -49,87 +48,81 @@ public class SwiftMetadataCollector implements MetadataCollector {
         }
     }
 
-    private SwiftApi getSwiftApi(SwiftStorage swiftStorage, SwiftSecret swiftSecret) {
-        String provider = "openstack-swift";
-
-        Properties overrides = new Properties();
-        overrides.put(KeystoneProperties.KEYSTONE_VERSION, swiftStorage.getKeystoneVersion() + "");
-
-        String identity = null;
-        String credential = null;
-        switch (swiftSecret.getSecretCase()) {
-            case PASSWORDSECRET:
-                identity = swiftSecret.getPasswordSecret().getDomainId() + ":" + swiftSecret.getPasswordSecret().getUserName();
-                credential = swiftSecret.getPasswordSecret().getPassword();
-                overrides.put(KeystoneProperties.SCOPE, "projectId:" + swiftSecret.getPasswordSecret().getProjectId());
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
-                break;
-            case AUTHCREDENTIALSECRET:
-                identity = swiftSecret.getAuthCredentialSecret().getCredentialId();
-                credential = swiftSecret.getAuthCredentialSecret().getCredentialSecret();
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.API_ACCESS_KEY_CREDENTIALS);
-                break;
-        }
-
-        return ContextBuilder.newBuilder(provider)
-                .endpoint(swiftStorage.getEndpoint())
-                .credentials(identity, credential)
-                .overrides(overrides)
-                .buildApi(SwiftApi.class);
-    }
-
     @Override
     public ResourceMetadata getResourceMetadata(String resourcePath, boolean recursiveSearch) throws Exception {
         checkInitialized();
 
-        SwiftApi swiftApi = getSwiftApi(swiftStorage, swiftSecret);
-
-        ObjectApi objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
-
-        ResourceMetadata.Builder resourceBuilder = ResourceMetadata.newBuilder();
-        if ("".equals(resourcePath)) {
-            DirectoryMetadata.Builder rootDirBuilder = DirectoryMetadata.newBuilder();
-
-            ObjectList objectList = objectApi.list();
-            objectList.forEach(swiftObject -> {
-                FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
-                fileBuilder.setFriendlyName(swiftObject.getName());
-                fileBuilder.setResourcePath(swiftObject.getName());
-                fileBuilder.setCreatedTime(swiftObject.getLastModified().getTime());
-                fileBuilder.setUpdateTime(swiftObject.getLastModified().getTime());
-                fileBuilder.setResourceSize(swiftObject.getPayload().getContentMetadata().getContentLength());
-                rootDirBuilder.addFiles(fileBuilder);
-            });
-            resourceBuilder.setDirectory(rootDirBuilder);
-        } else {
-            SwiftObject swiftObject = objectApi.get(resourcePath);
-
-            if (swiftObject == null) {
-                resourceBuilder.setError(MetadataFetchError.NOT_FOUND);
-                return resourceBuilder.build();
+        SwiftApi swiftApi = SwiftUtil.createSwiftApi(swiftSecret, swiftStorage);
+
+        try {
+            ResourceMetadata.Builder resourceBuilder = ResourceMetadata.newBuilder();
+            if ("".equals(resourcePath) && "".equals(swiftStorage.getContainer())) {
+                FluentIterable<Container> containers = swiftApi.getContainerApi(swiftStorage.getRegion()).list();
+                DirectoryMetadata.Builder parentDir = DirectoryMetadata.newBuilder();
+                parentDir.setResourcePath("");
+                parentDir.setFriendlyName("");
+                containers.forEach(container -> {
+                    DirectoryMetadata.Builder bucketDir = DirectoryMetadata.newBuilder();
+                    bucketDir.setFriendlyName(container.getName());
+                    bucketDir.setResourcePath(container.getName());
+                    parentDir.addDirectories(bucketDir);
+                });
+                resourceBuilder.setDirectory(parentDir);
+
+            } else {
+                ObjectApi objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
+                if ("".equals(resourcePath)) {
+
+                    DirectoryMetadata.Builder rootDirBuilder = DirectoryMetadata.newBuilder();
+
+                    ObjectList objectList = objectApi.list();
+                    objectList.forEach(swiftObject -> {
+                        FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
+                        fileBuilder.setFriendlyName(swiftObject.getName());
+                        fileBuilder.setResourcePath(swiftObject.getName());
+                        fileBuilder.setCreatedTime(swiftObject.getLastModified().getTime());
+                        fileBuilder.setUpdateTime(swiftObject.getLastModified().getTime());
+                        fileBuilder.setResourceSize(swiftObject.getPayload().getContentMetadata().getContentLength());
+                        rootDirBuilder.addFiles(fileBuilder);
+                    });
+                    resourceBuilder.setDirectory(rootDirBuilder);
+                } else {
+                    SwiftObject swiftObject = objectApi.get(resourcePath);
+
+                    if (swiftObject == null) {
+                        resourceBuilder.setError(MetadataFetchError.NOT_FOUND);
+                        return resourceBuilder.build();
+                    }
+
+                    FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
+                    fileBuilder.setFriendlyName(swiftObject.getName());
+                    fileBuilder.setResourcePath(swiftObject.getName());
+                    fileBuilder.setCreatedTime(swiftObject.getLastModified().getTime());
+                    fileBuilder.setUpdateTime(swiftObject.getLastModified().getTime());
+                    fileBuilder.setResourceSize(swiftObject.getPayload().getContentMetadata().getContentLength());
+                    resourceBuilder.setFile(fileBuilder);
+                }
             }
-
-            FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
-            fileBuilder.setFriendlyName(swiftObject.getName());
-            fileBuilder.setResourcePath(swiftObject.getName());
-            fileBuilder.setCreatedTime(swiftObject.getLastModified().getTime());
-            fileBuilder.setUpdateTime(swiftObject.getLastModified().getTime());
-            fileBuilder.setResourceSize(swiftObject.getPayload().getContentMetadata().getContentLength());
-            resourceBuilder.setFile(fileBuilder);
+            return resourceBuilder.build();
+        } finally{
+            swiftApi.close();
         }
-        return resourceBuilder.build();
     }
 
     @Override
     public Boolean isAvailable(String resourcePath) throws Exception {
         checkInitialized();
 
-        SwiftApi swiftApi = getSwiftApi(swiftStorage, swiftSecret);
+        SwiftApi swiftApi = SwiftUtil.createSwiftApi(swiftSecret, swiftStorage);
 
-        ObjectApi objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
+        try {
+            ObjectApi objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
 
-        SwiftObject swiftObject = objectApi.get(resourcePath);
+            SwiftObject swiftObject = objectApi.get(resourcePath);
 
-        return swiftObject != null;
+            return swiftObject != null;
+        } finally {
+            swiftApi.close();
+        }
     }
 }
diff --git a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftOutgoingConnector.java b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftOutgoingConnector.java
index 310143b..31132d5 100644
--- a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftOutgoingConnector.java
+++ b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftOutgoingConnector.java
@@ -60,34 +60,7 @@ public class SwiftOutgoingConnector implements OutgoingChunkedConnector {
         this.resourcePath = cc.getResourcePath();
 
         SwiftSecret swiftSecret = cc.getSecret().getSwift();
-
-        String provider = "openstack-swift";
-
-        Properties overrides = new Properties();
-        overrides.put(KeystoneProperties.KEYSTONE_VERSION, swiftStorage.getKeystoneVersion() + "");
-
-        String identity = null;
-        String credential = null;
-        switch (swiftSecret.getSecretCase()) {
-            case PASSWORDSECRET:
-                identity = swiftSecret.getPasswordSecret().getDomainId() + ":" + swiftSecret.getPasswordSecret().getUserName();
-                credential = swiftSecret.getPasswordSecret().getPassword();
-                overrides.put(KeystoneProperties.SCOPE, "projectId:" + swiftSecret.getPasswordSecret().getProjectId());
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
-                break;
-            case AUTHCREDENTIALSECRET:
-                identity = swiftSecret.getAuthCredentialSecret().getCredentialId();
-                credential = swiftSecret.getAuthCredentialSecret().getCredentialSecret();
-                overrides.put(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.API_ACCESS_KEY_CREDENTIALS);
-                break;
-        }
-
-        swiftApi = ContextBuilder.newBuilder(provider)
-                .endpoint(swiftStorage.getEndpoint())
-                .credentials(identity, credential)
-                .overrides(overrides)
-                .buildApi(SwiftApi.class);
-
+        swiftApi = SwiftUtil.createSwiftApi(swiftSecret, swiftStorage);
         objectApi = swiftApi.getObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
         staticLargeObjectApi = swiftApi.getStaticLargeObjectApi(swiftStorage.getRegion(), swiftStorage.getContainer());
     }
diff --git a/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftUtil.java b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftUtil.java
new file mode 100644
index 0000000..4145854
--- /dev/null
+++ b/transport/swift-transport/src/main/java/org/apache/airavata/mft/transport/swift/SwiftUtil.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.airavata.mft.transport.swift;
+
+import java.util.Properties;
+import org.apache.airavata.mft.credential.stubs.swift.SwiftSecret;
+import org.apache.airavata.mft.credential.stubs.swift.SwiftV2AuthSecret;
+import org.apache.airavata.mft.credential.stubs.swift.SwiftV3AuthSecret;
+import org.apache.airavata.mft.resource.stubs.swift.storage.SwiftStorage;
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.keystone.config.KeystoneProperties;
+import org.jclouds.openstack.swift.v1.SwiftApi;
+
+// https://jclouds.apache.org/guides/openstack/
+public class SwiftUtil {
+    public static SwiftApi createSwiftApi(SwiftSecret swiftSecret, SwiftStorage swiftStorage) throws Exception {
+      String provider = "openstack-swift";
+      Properties overrides = new Properties();
+      switch (swiftSecret.getSecretCase()) {
+          case V2AUTHSECRET:
+              SwiftV2AuthSecret v2AuthSecret = swiftSecret.getV2AuthSecret();
+              overrides.put(KeystoneProperties.KEYSTONE_VERSION, "2");
+              return ContextBuilder.newBuilder(provider)
+                  .endpoint(swiftSecret.getEndpoint())
+                  .credentials(v2AuthSecret.getTenant() + ":" + v2AuthSecret.getUserName(),
+                      v2AuthSecret.getPassword())
+                  .overrides(overrides)
+                  .buildApi(SwiftApi.class);
+
+          case V3AUTHSECRET:
+
+              SwiftV3AuthSecret v3AuthSecret = swiftSecret.getV3AuthSecret();
+              overrides.put(KeystoneProperties.KEYSTONE_VERSION, "3");
+              if (!"".equals(v3AuthSecret.getTenantName())) {
+                  overrides.put(KeystoneProperties.SCOPE, "project:" + v3AuthSecret.getTenantName());
+              }
+
+              if (!"".equals(v3AuthSecret.getProjectDomainName())) {
+                  overrides.put(KeystoneProperties.PROJECT_DOMAIN_NAME, v3AuthSecret.getProjectDomainName());
+              }
+
+              return ContextBuilder.newBuilder(provider)
+                  .endpoint(swiftSecret.getEndpoint())
+                  .credentials(v3AuthSecret.getUserDomainName() + ":" + v3AuthSecret.getUserName(),
+                      v3AuthSecret.getPassword())
+                  .overrides(overrides)
+                  .buildApi(SwiftApi.class);
+
+          default:
+            throw new Exception("No v2 or v3 auth secret set");
+      }
+    }
+}