You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ya...@apache.org on 2025/07/14 02:39:28 UTC

(airavata) branch master updated: [python-sdk] generate code from latest thrift stubs. add Makefile. bump version to 2.1.6

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 005766c4ac [python-sdk] generate code from latest thrift stubs. add Makefile. bump version to 2.1.6
005766c4ac is described below

commit 005766c4ac7581c632d4022a73e6fd0907336b3e
Author: yasithdev <ya...@icloud.com>
AuthorDate: Sun Jul 13 21:39:18 2025 -0500

    [python-sdk] generate code from latest thrift stubs. add Makefile. bump version to 2.1.6
---
 dev-tools/airavata-python-sdk/Makefile             |   19 +
 dev-tools/airavata-python-sdk/airavata/__init__.py |    4 -
 .../airavata-python-sdk/airavata/api/__init__.py   |    5 -
 .../airavata/api/credential/__init__.py            |    4 -
 .../airavata/api/credential/store/__init__.py      |    5 -
 .../api/credential/store/error/__init__.py         |    5 -
 .../airavata/api/credential/store/ttypes.py        |    2 +-
 .../airavata/api/error/__init__.py                 |    5 -
 .../airavata/api/error/ttypes.py                   |    1 -
 .../airavata/api/sharing/__init__.py               |    5 -
 .../airavata/api/sharing/ttypes.py                 |    2 +-
 .../airavata-python-sdk/airavata/api/ttypes.py     |    4 +-
 .../airavata/api/workflow/Workflow-remote          |  166 ++
 .../airavata/api/workflow/Workflow.py              | 1738 ++++++++++++++++++++
 .../airavata/api/workflow/__init__.py              |    1 +
 .../{service/profile => api/workflow}/constants.py |    1 +
 .../profile/tenant/cpi => api/workflow}/ttypes.py  |    9 +-
 .../airavata-python-sdk/airavata/base/__init__.py  |    4 -
 .../airavata/base/api/__init__.py                  |    5 -
 .../airavata-python-sdk/airavata/model/__init__.py |    5 -
 .../airavata/model/appcatalog/__init__.py          |    4 -
 .../appcatalog/accountprovisioning/__init__.py     |    5 -
 .../model/appcatalog/appdeployment/__init__.py     |    5 -
 .../model/appcatalog/appinterface/__init__.py      |    5 -
 .../model/appcatalog/appinterface/ttypes.py        |    2 +-
 .../model/appcatalog/computeresource/__init__.py   |    5 -
 .../model/appcatalog/gatewaygroups/__init__.py     |    5 -
 .../model/appcatalog/gatewayprofile/__init__.py    |    5 -
 .../model/appcatalog/gatewayprofile/ttypes.py      |    1 -
 .../appcatalog/groupresourceprofile/__init__.py    |    5 -
 .../appcatalog/groupresourceprofile/ttypes.py      |  509 ++++--
 .../model/appcatalog/parallelism/__init__.py       |    5 -
 .../airavata/model/appcatalog/parser/__init__.py   |    5 -
 .../model/appcatalog/storageresource/__init__.py   |    5 -
 .../appcatalog/userresourceprofile/__init__.py     |    5 -
 .../model/appcatalog/userresourceprofile/ttypes.py |    3 -
 .../airavata/model/application/__init__.py         |    4 -
 .../airavata/model/application/io/__init__.py      |    5 -
 .../airavata/model/application/io/ttypes.py        |    1 -
 .../airavata/model/commons/__init__.py             |    5 -
 .../airavata/model/credential/__init__.py          |    4 -
 .../airavata/model/credential/store/__init__.py    |    5 -
 .../airavata/model/data/__init__.py                |    4 -
 .../airavata/model/data/movement/__init__.py       |    5 -
 .../airavata/model/data/replica/__init__.py        |    5 -
 .../airavata/model/dbevent/__init__.py             |    5 -
 .../airavata/model/experiment/__init__.py          |    5 -
 .../airavata/model/group/__init__.py               |    5 -
 .../airavata/model/group/ttypes.py                 |    1 -
 .../airavata/model/job/__init__.py                 |    5 -
 .../airavata/model/messaging/__init__.py           |    4 -
 .../airavata/model/messaging/event/__init__.py     |    5 -
 .../airavata/model/messaging/event/ttypes.py       |    2 +-
 .../airavata/model/process/__init__.py             |    5 -
 .../airavata/model/process/ttypes.py               |    2 +-
 .../airavata/model/scheduling/__init__.py          |    5 -
 .../airavata/model/security/__init__.py            |    5 -
 .../airavata/model/sharing/__init__.py             |    5 -
 .../airavata/model/status/__init__.py              |    5 -
 .../airavata/model/task/__init__.py                |    5 -
 .../airavata/model/task/ttypes.py                  |    4 +-
 .../airavata/model/tenant/__init__.py              |    5 -
 .../airavata/model/tenant/ttypes.py                |    1 -
 .../airavata-python-sdk/airavata/model/ttypes.py   |  768 ++++++++-
 .../airavata/model/user/__init__.py                |    5 -
 .../airavata/model/workflow/__init__.py            |    5 -
 .../airavata/model/workspace/__init__.py           |    5 -
 .../airavata/service/__init__.py                   |    4 -
 .../airavata/service/profile/__init__.py           |    6 -
 .../service/profile/groupmanager/__init__.py       |    4 -
 .../service/profile/groupmanager/cpi/__init__.py   |    5 -
 .../profile/groupmanager/cpi/error/__init__.py     |    5 -
 .../service/profile/groupmanager/cpi/ttypes.py     |    4 +-
 .../airavata/service/profile/iam/__init__.py       |    4 -
 .../airavata/service/profile/iam/admin/__init__.py |    4 -
 .../service/profile/iam/admin/services/__init__.py |    4 -
 .../profile/iam/admin/services/cpi/__init__.py     |    5 -
 .../iam/admin/services/cpi/error/__init__.py       |    5 -
 .../profile/iam/admin/services/cpi/ttypes.py       |    8 +-
 .../airavata/service/profile/tenant/__init__.py    |    4 -
 .../service/profile/tenant/cpi/__init__.py         |    5 -
 .../service/profile/tenant/cpi/error/__init__.py   |    5 -
 .../airavata/service/profile/tenant/cpi/ttypes.py  |    4 +-
 .../airavata/service/profile/ttypes.py             |   27 -
 .../airavata/service/profile/user/__init__.py      |    4 -
 .../airavata/service/profile/user/cpi/__init__.py  |    5 -
 .../service/profile/user/cpi/error/__init__.py     |    5 -
 .../airavata/service/profile/user/cpi/ttypes.py    |    4 +-
 dev-tools/airavata-python-sdk/pyproject.toml       |    2 +-
 thrift-interface-descriptions/stubs_python.thrift  |   60 +
 90 files changed, 3140 insertions(+), 502 deletions(-)

diff --git a/dev-tools/airavata-python-sdk/Makefile b/dev-tools/airavata-python-sdk/Makefile
new file mode 100644
index 0000000000..6fed805e91
--- /dev/null
+++ b/dev-tools/airavata-python-sdk/Makefile
@@ -0,0 +1,19 @@
+BASEDIR:=$(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../..)
+OUTDIR:=$(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
+clean:
+	rm -rf $(OUTDIR)/airavata
+	rm -rf $(OUTDIR)/dist
+	rm -rf $(OUTDIR)/build
+	rm -rf $(OUTDIR)/airavata.egg-info
+
+thrift: clean
+	thrift -r -o $(OUTDIR) --gen py:enum,type_hints ${BASEDIR}/thrift-interface-descriptions/stubs_python.thrift && \
+	cp -r $(OUTDIR)/gen-py/airavata $(OUTDIR) && \
+	rm -rf $(OUTDIR)/gen-py
+
+build: thrift
+	python -m build
+
+deploy: build
+	twine upload --repository airavata dist/*
\ No newline at end of file
diff --git a/dev-tools/airavata-python-sdk/airavata/__init__.py b/dev-tools/airavata-python-sdk/airavata/__init__.py
index 7bf193ae61..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import api, base, model, service
diff --git a/dev-tools/airavata-python-sdk/airavata/api/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/__init__.py
index 790c71cb23..e85fb34030 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'Airavata']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import credential, error, sharing, Airavata, constants, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/api/credential/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/credential/__init__.py
index ec03c45cea..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/credential/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/credential/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import store
diff --git a/dev-tools/airavata-python-sdk/airavata/api/credential/store/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/credential/store/__init__.py
index b1c72ee879..5d704d6952 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/credential/store/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/credential/store/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'CredentialStoreService']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import error, constants, CredentialStoreService, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/api/credential/store/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/credential/store/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/credential/store/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/credential/store/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/api/credential/store/ttypes.py b/dev-tools/airavata-python-sdk/airavata/api/credential/store/ttypes.py
index 06b323c176..f299291af9 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/credential/store/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/credential/store/ttypes.py
@@ -15,9 +15,9 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.credential.store.ttypes
 import airavata.api.credential.store.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.credential.store.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/api/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/api/error/ttypes.py b/dev-tools/airavata-python-sdk/airavata/api/error/ttypes.py
index 4b7fe21765..ba3e0dceec 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/error/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/error/ttypes.py
@@ -15,7 +15,6 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.experiment.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/api/sharing/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/sharing/__init__.py
index 7650c5bcfc..35a411caae 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/sharing/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/sharing/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'SharingRegistryService']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants, SharingRegistryService
diff --git a/dev-tools/airavata-python-sdk/airavata/api/sharing/ttypes.py b/dev-tools/airavata-python-sdk/airavata/api/sharing/ttypes.py
index d7c9737e4e..4786690a46 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/sharing/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/sharing/ttypes.py
@@ -15,8 +15,8 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.sharing.ttypes
 import airavata.base.api.ttypes
+import airavata.model.sharing.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/api/ttypes.py b/dev-tools/airavata-python-sdk/airavata/api/ttypes.py
index ac73d6aa23..ccac1b8515 100644
--- a/dev-tools/airavata-python-sdk/airavata/api/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/ttypes.py
@@ -17,7 +17,7 @@ from enum import IntEnum
 import sys
 import airavata.api.error.ttypes
 import airavata.model.security.ttypes
-import airavata.model.ttypes
+import airavata.base.api.ttypes
 import airavata.model.credential.store.ttypes
 import airavata.model.status.ttypes
 import airavata.model.job.ttypes
@@ -38,8 +38,6 @@ import airavata.model.data.movement.ttypes
 import airavata.model.appcatalog.gatewaygroups.ttypes
 import airavata.model.data.replica.ttypes
 import airavata.model.group.ttypes
-import airavata.model.user.ttypes
-import airavata.base.api.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow-remote b/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow-remote
new file mode 100755
index 0000000000..9c4717325c
--- /dev/null
+++ b/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow-remote
@@ -0,0 +1,166 @@
+#!/usr/bin/env python
+#
+# Autogenerated by Thrift Compiler (0.21.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py:enum,type_hints
+#
+
+import sys
+import pprint
+if sys.version_info[0] > 2:
+    from urllib.parse import urlparse
+else:
+    from urlparse import urlparse
+from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+
+from airavata.api.workflow import Workflow
+from airavata.api.workflow.ttypes import *
+
+if len(sys.argv) <= 1 or sys.argv[1] == '--help':
+    print('')
+    print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
+    print('')
+    print('Functions:')
+    print('   getAllWorkflows()')
+    print('  WorkflowModel getWorkflow(string workflowTemplateId)')
+    print('  void deleteWorkflow(string workflowTemplateId)')
+    print('  string registerWorkflow(WorkflowModel workflow)')
+    print('  void updateWorkflow(string workflowTemplateId, WorkflowModel workflow)')
+    print('  string getWorkflowTemplateId(string workflowName)')
+    print('  bool isWorkflowExistWithName(string workflowName)')
+    print('  string getAPIVersion()')
+    print('')
+    sys.exit(0)
+
+pp = pprint.PrettyPrinter(indent=2)
+host = 'localhost'
+port = 9090
+uri = ''
+framed = False
+ssl = False
+validate = True
+ca_certs = None
+keyfile = None
+certfile = None
+http = False
+argi = 1
+
+if sys.argv[argi] == '-h':
+    parts = sys.argv[argi + 1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    argi += 2
+
+if sys.argv[argi] == '-u':
+    url = urlparse(sys.argv[argi + 1])
+    parts = url[1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    else:
+        port = 80
+    uri = url[2]
+    if url[4]:
+        uri += '?%s' % url[4]
+    http = True
+    argi += 2
+
+if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
+    framed = True
+    argi += 1
+
+if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
+    ssl = True
+    argi += 1
+
+if sys.argv[argi] == '-novalidate':
+    validate = False
+    argi += 1
+
+if sys.argv[argi] == '-ca_certs':
+    ca_certs = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-keyfile':
+    keyfile = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-certfile':
+    certfile = sys.argv[argi+1]
+    argi += 2
+
+cmd = sys.argv[argi]
+args = sys.argv[argi + 1:]
+
+if http:
+    transport = THttpClient.THttpClient(host, port, uri)
+else:
+    if ssl:
+        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
+    else:
+        socket = TSocket.TSocket(host, port)
+    if framed:
+        transport = TTransport.TFramedTransport(socket)
+    else:
+        transport = TTransport.TBufferedTransport(socket)
+protocol = TBinaryProtocol(transport)
+client = Workflow.Client(protocol)
+transport.open()
+
+if cmd == 'getAllWorkflows':
+    if len(args) != 0:
+        print('getAllWorkflows requires 0 args')
+        sys.exit(1)
+    pp.pprint(client.getAllWorkflows())
+
+elif cmd == 'getWorkflow':
+    if len(args) != 1:
+        print('getWorkflow requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.getWorkflow(args[0],))
+
+elif cmd == 'deleteWorkflow':
+    if len(args) != 1:
+        print('deleteWorkflow requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.deleteWorkflow(args[0],))
+
+elif cmd == 'registerWorkflow':
+    if len(args) != 1:
+        print('registerWorkflow requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.registerWorkflow(eval(args[0]),))
+
+elif cmd == 'updateWorkflow':
+    if len(args) != 2:
+        print('updateWorkflow requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.updateWorkflow(args[0], eval(args[1]),))
+
+elif cmd == 'getWorkflowTemplateId':
+    if len(args) != 1:
+        print('getWorkflowTemplateId requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.getWorkflowTemplateId(args[0],))
+
+elif cmd == 'isWorkflowExistWithName':
+    if len(args) != 1:
+        print('isWorkflowExistWithName requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.isWorkflowExistWithName(args[0],))
+
+elif cmd == 'getAPIVersion':
+    if len(args) != 0:
+        print('getAPIVersion requires 0 args')
+        sys.exit(1)
+    pp.pprint(client.getAPIVersion())
+
+else:
+    print('Unrecognized method %s' % cmd)
+    sys.exit(1)
+
+transport.close()
diff --git a/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow.py b/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow.py
new file mode 100644
index 0000000000..44f4794835
--- /dev/null
+++ b/dev-tools/airavata-python-sdk/airavata/api/workflow/Workflow.py
@@ -0,0 +1,1738 @@
+#
+# Autogenerated by Thrift Compiler (0.21.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py:enum,type_hints
+#
+
+from __future__ import annotations
+import typing
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+from thrift.TRecursive import fix_spec
+from uuid import UUID
+from enum import IntEnum
+
+import sys
+import airavata.base.api.BaseAPI
+import logging
+from .ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+all_structs = []
+
+
+class Iface(airavata.base.api.BaseAPI.Iface):
+    def getAllWorkflows(self) -> list[str]:
+        pass
+
+    def getWorkflow(self, workflowTemplateId: str) -> airavata.model.ttypes.WorkflowModel:
+        """
+        Parameters:
+         - workflowTemplateId
+
+        """
+        pass
+
+    def deleteWorkflow(self, workflowTemplateId: str) -> None:
+        """
+        Parameters:
+         - workflowTemplateId
+
+        """
+        pass
+
+    def registerWorkflow(self, workflow: airavata.model.ttypes.WorkflowModel) -> str:
+        """
+        Parameters:
+         - workflow
+
+        """
+        pass
+
+    def updateWorkflow(self, workflowTemplateId: str, workflow: airavata.model.ttypes.WorkflowModel) -> None:
+        """
+        Parameters:
+         - workflowTemplateId
+         - workflow
+
+        """
+        pass
+
+    def getWorkflowTemplateId(self, workflowName: str) -> str:
+        """
+        Parameters:
+         - workflowName
+
+        """
+        pass
+
+    def isWorkflowExistWithName(self, workflowName: str) -> bool:
+        """
+        Parameters:
+         - workflowName
+
+        """
+        pass
+
+
+class Client(airavata.base.api.BaseAPI.Client, Iface):
+    def __init__(self, iprot, oprot=None):
+        airavata.base.api.BaseAPI.Client.__init__(self, iprot, oprot)
+
+    def getAllWorkflows(self) -> list[str]:
+        self.send_getAllWorkflows()
+        return self.recv_getAllWorkflows()
+
+    def send_getAllWorkflows(self):
+        self._oprot.writeMessageBegin('getAllWorkflows', TMessageType.CALL, self._seqid)
+        args = getAllWorkflows_args()
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllWorkflows(self) -> list[str]:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllWorkflows_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllWorkflows failed: unknown result")
+
+    def getWorkflow(self, workflowTemplateId: str) -> airavata.model.ttypes.WorkflowModel:
+        """
+        Parameters:
+         - workflowTemplateId
+
+        """
+        self.send_getWorkflow(workflowTemplateId)
+        return self.recv_getWorkflow()
+
+    def send_getWorkflow(self, workflowTemplateId: str):
+        self._oprot.writeMessageBegin('getWorkflow', TMessageType.CALL, self._seqid)
+        args = getWorkflow_args()
+        args.workflowTemplateId = workflowTemplateId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getWorkflow(self) -> airavata.model.ttypes.WorkflowModel:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getWorkflow_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getWorkflow failed: unknown result")
+
+    def deleteWorkflow(self, workflowTemplateId: str) -> None:
+        """
+        Parameters:
+         - workflowTemplateId
+
+        """
+        self.send_deleteWorkflow(workflowTemplateId)
+        self.recv_deleteWorkflow()
+
+    def send_deleteWorkflow(self, workflowTemplateId: str):
+        self._oprot.writeMessageBegin('deleteWorkflow', TMessageType.CALL, self._seqid)
+        args = deleteWorkflow_args()
+        args.workflowTemplateId = workflowTemplateId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deleteWorkflow(self) -> None:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deleteWorkflow_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        return
+
+    def registerWorkflow(self, workflow: airavata.model.ttypes.WorkflowModel) -> str:
+        """
+        Parameters:
+         - workflow
+
+        """
+        self.send_registerWorkflow(workflow)
+        return self.recv_registerWorkflow()
+
+    def send_registerWorkflow(self, workflow: airavata.model.ttypes.WorkflowModel):
+        self._oprot.writeMessageBegin('registerWorkflow', TMessageType.CALL, self._seqid)
+        args = registerWorkflow_args()
+        args.workflow = workflow
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_registerWorkflow(self) -> str:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = registerWorkflow_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "registerWorkflow failed: unknown result")
+
+    def updateWorkflow(self, workflowTemplateId: str, workflow: airavata.model.ttypes.WorkflowModel) -> None:
+        """
+        Parameters:
+         - workflowTemplateId
+         - workflow
+
+        """
+        self.send_updateWorkflow(workflowTemplateId, workflow)
+        self.recv_updateWorkflow()
+
+    def send_updateWorkflow(self, workflowTemplateId: str, workflow: airavata.model.ttypes.WorkflowModel):
+        self._oprot.writeMessageBegin('updateWorkflow', TMessageType.CALL, self._seqid)
+        args = updateWorkflow_args()
+        args.workflowTemplateId = workflowTemplateId
+        args.workflow = workflow
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_updateWorkflow(self) -> None:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = updateWorkflow_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        return
+
+    def getWorkflowTemplateId(self, workflowName: str) -> str:
+        """
+        Parameters:
+         - workflowName
+
+        """
+        self.send_getWorkflowTemplateId(workflowName)
+        return self.recv_getWorkflowTemplateId()
+
+    def send_getWorkflowTemplateId(self, workflowName: str):
+        self._oprot.writeMessageBegin('getWorkflowTemplateId', TMessageType.CALL, self._seqid)
+        args = getWorkflowTemplateId_args()
+        args.workflowName = workflowName
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getWorkflowTemplateId(self) -> str:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getWorkflowTemplateId_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getWorkflowTemplateId failed: unknown result")
+
+    def isWorkflowExistWithName(self, workflowName: str) -> bool:
+        """
+        Parameters:
+         - workflowName
+
+        """
+        self.send_isWorkflowExistWithName(workflowName)
+        return self.recv_isWorkflowExistWithName()
+
+    def send_isWorkflowExistWithName(self, workflowName: str):
+        self._oprot.writeMessageBegin('isWorkflowExistWithName', TMessageType.CALL, self._seqid)
+        args = isWorkflowExistWithName_args()
+        args.workflowName = workflowName
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_isWorkflowExistWithName(self) -> bool:
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = isWorkflowExistWithName_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "isWorkflowExistWithName failed: unknown result")
+
+
+class Processor(airavata.base.api.BaseAPI.Processor, Iface, TProcessor):
+    def __init__(self, handler):
+        airavata.base.api.BaseAPI.Processor.__init__(self, handler)
+        self._processMap["getAllWorkflows"] = Processor.process_getAllWorkflows
+        self._processMap["getWorkflow"] = Processor.process_getWorkflow
+        self._processMap["deleteWorkflow"] = Processor.process_deleteWorkflow
+        self._processMap["registerWorkflow"] = Processor.process_registerWorkflow
+        self._processMap["updateWorkflow"] = Processor.process_updateWorkflow
+        self._processMap["getWorkflowTemplateId"] = Processor.process_getWorkflowTemplateId
+        self._processMap["isWorkflowExistWithName"] = Processor.process_isWorkflowExistWithName
+        self._on_message_begin = None
+
+    def on_message_begin(self, func):
+        self._on_message_begin = func
+
+    def process(self, iprot, oprot):
+        (name, type, seqid) = iprot.readMessageBegin()
+        if self._on_message_begin:
+            self._on_message_begin(name, type, seqid)
+        if name not in self._processMap:
+            iprot.skip(TType.STRUCT)
+            iprot.readMessageEnd()
+            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+            x.write(oprot)
+            oprot.writeMessageEnd()
+            oprot.trans.flush()
+            return
+        else:
+            self._processMap[name](self, seqid, iprot, oprot)
+        return True
+
+    def process_getAllWorkflows(self, seqid, iprot, oprot):
+        args = getAllWorkflows_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllWorkflows_result()
+        try:
+            result.success = self._handler.getAllWorkflows()
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllWorkflows", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getWorkflow(self, seqid, iprot, oprot):
+        args = getWorkflow_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getWorkflow_result()
+        try:
+            result.success = self._handler.getWorkflow(args.workflowTemplateId)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getWorkflow", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deleteWorkflow(self, seqid, iprot, oprot):
+        args = deleteWorkflow_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deleteWorkflow_result()
+        try:
+            self._handler.deleteWorkflow(args.workflowTemplateId)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deleteWorkflow", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_registerWorkflow(self, seqid, iprot, oprot):
+        args = registerWorkflow_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = registerWorkflow_result()
+        try:
+            result.success = self._handler.registerWorkflow(args.workflow)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("registerWorkflow", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_updateWorkflow(self, seqid, iprot, oprot):
+        args = updateWorkflow_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = updateWorkflow_result()
+        try:
+            self._handler.updateWorkflow(args.workflowTemplateId, args.workflow)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("updateWorkflow", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getWorkflowTemplateId(self, seqid, iprot, oprot):
+        args = getWorkflowTemplateId_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getWorkflowTemplateId_result()
+        try:
+            result.success = self._handler.getWorkflowTemplateId(args.workflowName)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getWorkflowTemplateId", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_isWorkflowExistWithName(self, seqid, iprot, oprot):
+        args = isWorkflowExistWithName_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = isWorkflowExistWithName_result()
+        try:
+            result.success = self._handler.isWorkflowExistWithName(args.workflowName)
+            msg_type = TMessageType.REPLY
+        except TTransport.TTransportException:
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except TApplicationException as ex:
+            logging.exception('TApplication exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = ex
+        except Exception:
+            logging.exception('Unexpected exception in handler')
+            msg_type = TMessageType.EXCEPTION
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("isWorkflowExistWithName", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+
+class getAllWorkflows_args(object):
+    thrift_spec: typing.Any = None
+
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getAllWorkflows_args')
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getAllWorkflows_args)
+getAllWorkflows_args.thrift_spec = (
+)
+
+
+class getAllWorkflows_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, success: typing.Optional[list[str]] = None, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.success: typing.Optional[list[str]] = success
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getAllWorkflows_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRING, len(self.success))
+            for iter6 in self.success:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getAllWorkflows_result)
+getAllWorkflows_result.thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class getWorkflow_args(object):
+    """
+    Attributes:
+     - workflowTemplateId
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflowTemplateId: str = None,):
+        self.workflowTemplateId: str = workflowTemplateId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.workflowTemplateId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getWorkflow_args')
+        if self.workflowTemplateId is not None:
+            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 1)
+            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflowTemplateId is None:
+            raise TProtocolException(message='Required field workflowTemplateId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getWorkflow_args)
+getWorkflow_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 1
+)
+
+
+class getWorkflow_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, success: typing.Optional[airavata.model.ttypes.WorkflowModel] = None, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.success: typing.Optional[airavata.model.ttypes.WorkflowModel] = success
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.ttypes.WorkflowModel()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getWorkflow_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getWorkflow_result)
+getWorkflow_result.thrift_spec = (
+    (0, TType.STRUCT, 'success', [airavata.model.ttypes.WorkflowModel, None], None, ),  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class deleteWorkflow_args(object):
+    """
+    Attributes:
+     - workflowTemplateId
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflowTemplateId: str = None,):
+        self.workflowTemplateId: str = workflowTemplateId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.workflowTemplateId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('deleteWorkflow_args')
+        if self.workflowTemplateId is not None:
+            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 1)
+            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflowTemplateId is None:
+            raise TProtocolException(message='Required field workflowTemplateId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(deleteWorkflow_args)
+deleteWorkflow_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 1
+)
+
+
+class deleteWorkflow_result(object):
+    """
+    Attributes:
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('deleteWorkflow_result')
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(deleteWorkflow_result)
+deleteWorkflow_result.thrift_spec = (
+    None,  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class registerWorkflow_args(object):
+    """
+    Attributes:
+     - workflow
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflow: airavata.model.ttypes.WorkflowModel = None,):
+        self.workflow: airavata.model.ttypes.WorkflowModel = workflow
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.workflow = airavata.model.ttypes.WorkflowModel()
+                    self.workflow.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('registerWorkflow_args')
+        if self.workflow is not None:
+            oprot.writeFieldBegin('workflow', TType.STRUCT, 1)
+            self.workflow.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflow is None:
+            raise TProtocolException(message='Required field workflow is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(registerWorkflow_args)
+registerWorkflow_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRUCT, 'workflow', [airavata.model.ttypes.WorkflowModel, None], None, ),  # 1
+)
+
+
+class registerWorkflow_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, success: typing.Optional[str] = None, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.success: typing.Optional[str] = success
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('registerWorkflow_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(registerWorkflow_result)
+registerWorkflow_result.thrift_spec = (
+    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class updateWorkflow_args(object):
+    """
+    Attributes:
+     - workflowTemplateId
+     - workflow
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflowTemplateId: str = None, workflow: airavata.model.ttypes.WorkflowModel = None,):
+        self.workflowTemplateId: str = workflowTemplateId
+        self.workflow: airavata.model.ttypes.WorkflowModel = workflow
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.workflowTemplateId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.workflow = airavata.model.ttypes.WorkflowModel()
+                    self.workflow.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('updateWorkflow_args')
+        if self.workflowTemplateId is not None:
+            oprot.writeFieldBegin('workflowTemplateId', TType.STRING, 1)
+            oprot.writeString(self.workflowTemplateId.encode('utf-8') if sys.version_info[0] == 2 else self.workflowTemplateId)
+            oprot.writeFieldEnd()
+        if self.workflow is not None:
+            oprot.writeFieldBegin('workflow', TType.STRUCT, 2)
+            self.workflow.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflowTemplateId is None:
+            raise TProtocolException(message='Required field workflowTemplateId is unset!')
+        if self.workflow is None:
+            raise TProtocolException(message='Required field workflow is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(updateWorkflow_args)
+updateWorkflow_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'workflowTemplateId', 'UTF8', None, ),  # 1
+    (2, TType.STRUCT, 'workflow', [airavata.model.ttypes.WorkflowModel, None], None, ),  # 2
+)
+
+
+class updateWorkflow_result(object):
+    """
+    Attributes:
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('updateWorkflow_result')
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(updateWorkflow_result)
+updateWorkflow_result.thrift_spec = (
+    None,  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class getWorkflowTemplateId_args(object):
+    """
+    Attributes:
+     - workflowName
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflowName: str = None,):
+        self.workflowName: str = workflowName
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.workflowName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getWorkflowTemplateId_args')
+        if self.workflowName is not None:
+            oprot.writeFieldBegin('workflowName', TType.STRING, 1)
+            oprot.writeString(self.workflowName.encode('utf-8') if sys.version_info[0] == 2 else self.workflowName)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflowName is None:
+            raise TProtocolException(message='Required field workflowName is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getWorkflowTemplateId_args)
+getWorkflowTemplateId_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'workflowName', 'UTF8', None, ),  # 1
+)
+
+
+class getWorkflowTemplateId_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, success: typing.Optional[str] = None, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.success: typing.Optional[str] = success
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('getWorkflowTemplateId_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(getWorkflowTemplateId_result)
+getWorkflowTemplateId_result.thrift_spec = (
+    (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+
+
+class isWorkflowExistWithName_args(object):
+    """
+    Attributes:
+     - workflowName
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, workflowName: str = None,):
+        self.workflowName: str = workflowName
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.workflowName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('isWorkflowExistWithName_args')
+        if self.workflowName is not None:
+            oprot.writeFieldBegin('workflowName', TType.STRING, 1)
+            oprot.writeString(self.workflowName.encode('utf-8') if sys.version_info[0] == 2 else self.workflowName)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.workflowName is None:
+            raise TProtocolException(message='Required field workflowName is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(isWorkflowExistWithName_args)
+isWorkflowExistWithName_args.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'workflowName', 'UTF8', None, ),  # 1
+)
+
+
+class isWorkflowExistWithName_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, success: typing.Optional[bool] = None, ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = None, ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = None, ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = None,):
+        self.success: typing.Optional[bool] = success
+        self.ire: typing.Optional[airavata.api.error.ttypes.InvalidRequestException] = ire
+        self.ace: typing.Optional[airavata.api.error.ttypes.AiravataClientException] = ace
+        self.ase: typing.Optional[airavata.api.error.ttypes.AiravataSystemException] = ase
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('isWorkflowExistWithName_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(isWorkflowExistWithName_result)
+isWorkflowExistWithName_result.thrift_spec = (
+    (0, TType.BOOL, 'success', None, None, ),  # 0
+    (1, TType.STRUCT, 'ire', [airavata.api.error.ttypes.InvalidRequestException, None], None, ),  # 1
+    (2, TType.STRUCT, 'ace', [airavata.api.error.ttypes.AiravataClientException, None], None, ),  # 2
+    (3, TType.STRUCT, 'ase', [airavata.api.error.ttypes.AiravataSystemException, None], None, ),  # 3
+)
+fix_spec(all_structs)
+del all_structs
diff --git a/dev-tools/airavata-python-sdk/airavata/api/workflow/__init__.py b/dev-tools/airavata-python-sdk/airavata/api/workflow/__init__.py
new file mode 100644
index 0000000000..28b4f394c8
--- /dev/null
+++ b/dev-tools/airavata-python-sdk/airavata/api/workflow/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'Workflow']
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/constants.py b/dev-tools/airavata-python-sdk/airavata/api/workflow/constants.py
similarity index 93%
rename from dev-tools/airavata-python-sdk/airavata/service/profile/constants.py
rename to dev-tools/airavata-python-sdk/airavata/api/workflow/constants.py
index 65de08872f..bc2228fe55 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/constants.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/workflow/constants.py
@@ -16,3 +16,4 @@ from enum import IntEnum
 
 import sys
 from .ttypes import *
+WORKFLOW_API_VERSION = "0.18.0"
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py b/dev-tools/airavata-python-sdk/airavata/api/workflow/ttypes.py
similarity index 73%
copy from dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
copy to dev-tools/airavata-python-sdk/airavata/api/workflow/ttypes.py
index 7092d0d2a2..b57ef59e12 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/api/workflow/ttypes.py
@@ -16,10 +16,13 @@ from enum import IntEnum
 
 import sys
 import airavata.api.error.ttypes
-import airavata.model.security.ttypes
-import airavata.model.workspace.ttypes
-import airavata.service.profile.tenant.cpi.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.experiment.ttypes
+import airavata.model.workspace.ttypes
+import airavata.model.appcatalog.computeresource.ttypes
+import airavata.model.appcatalog.appdeployment.ttypes
+import airavata.model.appcatalog.appinterface.ttypes
+import airavata.model.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/base/__init__.py b/dev-tools/airavata-python-sdk/airavata/base/__init__.py
index bf13c0c98f..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/base/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/base/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import api
\ No newline at end of file
diff --git a/dev-tools/airavata-python-sdk/airavata/base/api/__init__.py b/dev-tools/airavata-python-sdk/airavata/base/api/__init__.py
index 034e355d5f..d9a4e6b8ec 100644
--- a/dev-tools/airavata-python-sdk/airavata/base/api/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/base/api/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'BaseAPI']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import BaseAPI, constants, ttypes
\ No newline at end of file
diff --git a/dev-tools/airavata-python-sdk/airavata/model/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/__init__.py
index 6be748cd08..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import appcatalog, application, commons, credential, data, dbevent, experiment, group, job, messaging, process, scheduling, security, sharing, status, task, tenant, user, workflow, workspace, constants, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/__init__.py
index ea117a60ee..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import accountprovisioning, appdeployment, appinterface, computeresource, gatewaygroups, gatewayprofile, groupresourceprofile, parallelism, parser, storageresource, userresourceprofile
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/accountprovisioning/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appdeployment/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py
index 89efce5044..eb9b57cbf9 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/appinterface/ttypes.py
@@ -15,8 +15,8 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.application.io.ttypes
 import airavata.model.commons.ttypes
+import airavata.model.application.io.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/computeresource/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewaygroups/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py
index 3a08ceac3f..0c2cdffd07 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/gatewayprofile/ttypes.py
@@ -17,7 +17,6 @@ from enum import IntEnum
 import sys
 import airavata.model.appcatalog.computeresource.ttypes
 import airavata.model.data.movement.ttypes
-import airavata.model.appcatalog.accountprovisioning.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
index d924a8836b..3a52b17e2a 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/groupresourceprofile/ttypes.py
@@ -23,6 +23,12 @@ from thrift.transport import TTransport
 all_structs = []
 
 
+class ResourceType(IntEnum):
+    SLURM = 0
+    AWS = 1
+
+
+
 class GroupAccountSSHProvisionerConfig(object):
     """
     Attributes:
@@ -242,6 +248,313 @@ class ComputeResourceReservation(object):
         return not (self == other)
 
 
+class SlurmComputeResourcePreference(object):
+    """
+    Attributes:
+     - allocationProjectNumber
+     - preferredBatchQueue
+     - qualityOfService
+     - usageReportingGatewayId
+     - sshAccountProvisioner
+     - groupSSHAccountProvisionerConfigs
+     - sshAccountProvisionerAdditionalInfo
+     - reservations
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, allocationProjectNumber: typing.Optional[str] = None, preferredBatchQueue: typing.Optional[str] = None, qualityOfService: typing.Optional[str] = None, usageReportingGatewayId: typing.Optional[str] = None, sshAccountProvisioner: typing.Optional[str] = None, groupSSHAccountProvisionerConfigs: typing.Optional[list[GroupAccountSSHProvisionerConfig]] = None, sshAccountProvisionerAdditionalInfo: typing.Optional[str] = None, reservations: typing.Optional[list[ComputeResou [...]
+        self.allocationProjectNumber: typing.Optional[str] = allocationProjectNumber
+        self.preferredBatchQueue: typing.Optional[str] = preferredBatchQueue
+        self.qualityOfService: typing.Optional[str] = qualityOfService
+        self.usageReportingGatewayId: typing.Optional[str] = usageReportingGatewayId
+        self.sshAccountProvisioner: typing.Optional[str] = sshAccountProvisioner
+        self.groupSSHAccountProvisionerConfigs: typing.Optional[list[GroupAccountSSHProvisionerConfig]] = groupSSHAccountProvisionerConfigs
+        self.sshAccountProvisionerAdditionalInfo: typing.Optional[str] = sshAccountProvisionerAdditionalInfo
+        self.reservations: typing.Optional[list[ComputeResourceReservation]] = reservations
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.allocationProjectNumber = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.preferredBatchQueue = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.qualityOfService = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.usageReportingGatewayId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.STRING:
+                    self.sshAccountProvisioner = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.LIST:
+                    self.groupSSHAccountProvisionerConfigs = []
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = GroupAccountSSHProvisionerConfig()
+                        _elem12.read(iprot)
+                        self.groupSSHAccountProvisionerConfigs.append(_elem12)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.STRING:
+                    self.sshAccountProvisionerAdditionalInfo = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.LIST:
+                    self.reservations = []
+                    (_etype16, _size13) = iprot.readListBegin()
+                    for _i17 in range(_size13):
+                        _elem18 = ComputeResourceReservation()
+                        _elem18.read(iprot)
+                        self.reservations.append(_elem18)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('SlurmComputeResourcePreference')
+        if self.allocationProjectNumber is not None:
+            oprot.writeFieldBegin('allocationProjectNumber', TType.STRING, 1)
+            oprot.writeString(self.allocationProjectNumber.encode('utf-8') if sys.version_info[0] == 2 else self.allocationProjectNumber)
+            oprot.writeFieldEnd()
+        if self.preferredBatchQueue is not None:
+            oprot.writeFieldBegin('preferredBatchQueue', TType.STRING, 2)
+            oprot.writeString(self.preferredBatchQueue.encode('utf-8') if sys.version_info[0] == 2 else self.preferredBatchQueue)
+            oprot.writeFieldEnd()
+        if self.qualityOfService is not None:
+            oprot.writeFieldBegin('qualityOfService', TType.STRING, 3)
+            oprot.writeString(self.qualityOfService.encode('utf-8') if sys.version_info[0] == 2 else self.qualityOfService)
+            oprot.writeFieldEnd()
+        if self.usageReportingGatewayId is not None:
+            oprot.writeFieldBegin('usageReportingGatewayId', TType.STRING, 4)
+            oprot.writeString(self.usageReportingGatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.usageReportingGatewayId)
+            oprot.writeFieldEnd()
+        if self.sshAccountProvisioner is not None:
+            oprot.writeFieldBegin('sshAccountProvisioner', TType.STRING, 5)
+            oprot.writeString(self.sshAccountProvisioner.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisioner)
+            oprot.writeFieldEnd()
+        if self.groupSSHAccountProvisionerConfigs is not None:
+            oprot.writeFieldBegin('groupSSHAccountProvisionerConfigs', TType.LIST, 6)
+            oprot.writeListBegin(TType.STRUCT, len(self.groupSSHAccountProvisionerConfigs))
+            for iter19 in self.groupSSHAccountProvisionerConfigs:
+                iter19.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.sshAccountProvisionerAdditionalInfo is not None:
+            oprot.writeFieldBegin('sshAccountProvisionerAdditionalInfo', TType.STRING, 7)
+            oprot.writeString(self.sshAccountProvisionerAdditionalInfo.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisionerAdditionalInfo)
+            oprot.writeFieldEnd()
+        if self.reservations is not None:
+            oprot.writeFieldBegin('reservations', TType.LIST, 8)
+            oprot.writeListBegin(TType.STRUCT, len(self.reservations))
+            for iter20 in self.reservations:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class AwsComputeResourcePreference(object):
+    """
+    Attributes:
+     - region
+     - preferredAmiId
+     - preferredInstanceType
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, region: typing.Optional[str] = None, preferredAmiId: typing.Optional[str] = None, preferredInstanceType: typing.Optional[str] = None,):
+        self.region: typing.Optional[str] = region
+        self.preferredAmiId: typing.Optional[str] = preferredAmiId
+        self.preferredInstanceType: typing.Optional[str] = preferredInstanceType
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.region = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.preferredAmiId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.preferredInstanceType = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('AwsComputeResourcePreference')
+        if self.region is not None:
+            oprot.writeFieldBegin('region', TType.STRING, 1)
+            oprot.writeString(self.region.encode('utf-8') if sys.version_info[0] == 2 else self.region)
+            oprot.writeFieldEnd()
+        if self.preferredAmiId is not None:
+            oprot.writeFieldBegin('preferredAmiId', TType.STRING, 2)
+            oprot.writeString(self.preferredAmiId.encode('utf-8') if sys.version_info[0] == 2 else self.preferredAmiId)
+            oprot.writeFieldEnd()
+        if self.preferredInstanceType is not None:
+            oprot.writeFieldBegin('preferredInstanceType', TType.STRING, 3)
+            oprot.writeString(self.preferredInstanceType.encode('utf-8') if sys.version_info[0] == 2 else self.preferredInstanceType)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class EnvironmentSpecificPreferences(object):
+    """
+    Attributes:
+     - slurm
+     - aws
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, slurm: typing.Optional[SlurmComputeResourcePreference] = None, aws: typing.Optional[AwsComputeResourcePreference] = None,):
+        self.slurm: typing.Optional[SlurmComputeResourcePreference] = slurm
+        self.aws: typing.Optional[AwsComputeResourcePreference] = aws
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.slurm = SlurmComputeResourcePreference()
+                    self.slurm.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.aws = AwsComputeResourcePreference()
+                    self.aws.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('EnvironmentSpecificPreferences')
+        if self.slurm is not None:
+            oprot.writeFieldBegin('slurm', TType.STRUCT, 1)
+            self.slurm.write(oprot)
+            oprot.writeFieldEnd()
+        if self.aws is not None:
+            oprot.writeFieldBegin('aws', TType.STRUCT, 2)
+            self.aws.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
 class GroupComputeResourcePreference(object):
     """
     Attributes:
@@ -249,40 +562,28 @@ class GroupComputeResourcePreference(object):
      - groupResourceProfileId
      - overridebyAiravata
      - loginUserName
+     - scratchLocation
      - preferredJobSubmissionProtocol
      - preferredDataMovementProtocol
-     - preferredBatchQueue
-     - scratchLocation
-     - allocationProjectNumber
      - resourceSpecificCredentialStoreToken
-     - usageReportingGatewayId
-     - qualityOfService
-     - sshAccountProvisioner
-     - groupSSHAccountProvisionerConfigs
-     - sshAccountProvisionerAdditionalInfo
-     - reservations
+     - resourceType
+     - specificPreferences
 
     """
     thrift_spec: typing.Any = None
 
 
-    def __init__(self, computeResourceId: str = None, groupResourceProfileId: str = "DO_NOT_SET_AT_CLIENTS", overridebyAiravata: bool = True, loginUserName: typing.Optional[str] = None, preferredJobSubmissionProtocol: typing.Optional[airavata.model.appcatalog.computeresource.ttypes.JobSubmissionProtocol] = None, preferredDataMovementProtocol: typing.Optional[airavata.model.data.movement.ttypes.DataMovementProtocol] = None, preferredBatchQueue: typing.Optional[str] = None, scratchLocation [...]
+    def __init__(self, computeResourceId: str = None, groupResourceProfileId: str = "DO_NOT_SET_AT_CLIENTS", overridebyAiravata: bool = True, loginUserName: typing.Optional[str] = None, scratchLocation: typing.Optional[str] = None, preferredJobSubmissionProtocol: typing.Optional[airavata.model.appcatalog.computeresource.ttypes.JobSubmissionProtocol] = None, preferredDataMovementProtocol: typing.Optional[airavata.model.data.movement.ttypes.DataMovementProtocol] = None, resourceSpecificCre [...]
         self.computeResourceId: str = computeResourceId
         self.groupResourceProfileId: str = groupResourceProfileId
         self.overridebyAiravata: bool = overridebyAiravata
         self.loginUserName: typing.Optional[str] = loginUserName
+        self.scratchLocation: typing.Optional[str] = scratchLocation
         self.preferredJobSubmissionProtocol: typing.Optional[airavata.model.appcatalog.computeresource.ttypes.JobSubmissionProtocol] = preferredJobSubmissionProtocol
         self.preferredDataMovementProtocol: typing.Optional[airavata.model.data.movement.ttypes.DataMovementProtocol] = preferredDataMovementProtocol
-        self.preferredBatchQueue: typing.Optional[str] = preferredBatchQueue
-        self.scratchLocation: typing.Optional[str] = scratchLocation
-        self.allocationProjectNumber: typing.Optional[str] = allocationProjectNumber
         self.resourceSpecificCredentialStoreToken: typing.Optional[str] = resourceSpecificCredentialStoreToken
-        self.usageReportingGatewayId: typing.Optional[str] = usageReportingGatewayId
-        self.qualityOfService: typing.Optional[str] = qualityOfService
-        self.sshAccountProvisioner: typing.Optional[str] = sshAccountProvisioner
-        self.groupSSHAccountProvisionerConfigs: typing.Optional[list[GroupAccountSSHProvisionerConfig]] = groupSSHAccountProvisionerConfigs
-        self.sshAccountProvisionerAdditionalInfo: typing.Optional[str] = sshAccountProvisionerAdditionalInfo
-        self.reservations: typing.Optional[list[ComputeResourceReservation]] = reservations
+        self.resourceType: ResourceType = resourceType
+        self.specificPreferences: typing.Optional[EnvironmentSpecificPreferences] = specificPreferences
 
     def __setattr__(self, name, value):
         if name == "preferredJobSubmissionProtocol":
@@ -291,6 +592,9 @@ class GroupComputeResourcePreference(object):
         if name == "preferredDataMovementProtocol":
             super().__setattr__(name, value if hasattr(value, 'value') else airavata.model.data.movement.ttypes.DataMovementProtocol.__members__.get(value))
             return
+        if name == "resourceType":
+            super().__setattr__(name, value if hasattr(value, 'value') else ResourceType.__members__.get(value))
+            return
         super().__setattr__(name, value)
 
 
@@ -324,75 +628,34 @@ class GroupComputeResourcePreference(object):
                 else:
                     iprot.skip(ftype)
             elif fid == 5:
-                if ftype == TType.I32:
-                    self.preferredJobSubmissionProtocol = airavata.model.appcatalog.computeresource.ttypes.JobSubmissionProtocol(iprot.readI32())
+                if ftype == TType.STRING:
+                    self.scratchLocation = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
             elif fid == 6:
                 if ftype == TType.I32:
-                    self.preferredDataMovementProtocol = airavata.model.data.movement.ttypes.DataMovementProtocol(iprot.readI32())
+                    self.preferredJobSubmissionProtocol = airavata.model.appcatalog.computeresource.ttypes.JobSubmissionProtocol(iprot.readI32())
                 else:
                     iprot.skip(ftype)
             elif fid == 7:
-                if ftype == TType.STRING:
-                    self.preferredBatchQueue = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                if ftype == TType.I32:
+                    self.preferredDataMovementProtocol = airavata.model.data.movement.ttypes.DataMovementProtocol(iprot.readI32())
                 else:
                     iprot.skip(ftype)
             elif fid == 8:
                 if ftype == TType.STRING:
-                    self.scratchLocation = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                    self.resourceSpecificCredentialStoreToken = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
             elif fid == 9:
-                if ftype == TType.STRING:
-                    self.allocationProjectNumber = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                if ftype == TType.I32:
+                    self.resourceType = ResourceType(iprot.readI32())
                 else:
                     iprot.skip(ftype)
             elif fid == 10:
-                if ftype == TType.STRING:
-                    self.resourceSpecificCredentialStoreToken = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 11:
-                if ftype == TType.STRING:
-                    self.usageReportingGatewayId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 12:
-                if ftype == TType.STRING:
-                    self.qualityOfService = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 16:
-                if ftype == TType.STRING:
-                    self.sshAccountProvisioner = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 17:
-                if ftype == TType.LIST:
-                    self.groupSSHAccountProvisionerConfigs = []
-                    (_etype10, _size7) = iprot.readListBegin()
-                    for _i11 in range(_size7):
-                        _elem12 = GroupAccountSSHProvisionerConfig()
-                        _elem12.read(iprot)
-                        self.groupSSHAccountProvisionerConfigs.append(_elem12)
-                    iprot.readListEnd()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 18:
-                if ftype == TType.STRING:
-                    self.sshAccountProvisionerAdditionalInfo = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 19:
-                if ftype == TType.LIST:
-                    self.reservations = []
-                    (_etype16, _size13) = iprot.readListBegin()
-                    for _i17 in range(_size13):
-                        _elem18 = ComputeResourceReservation()
-                        _elem18.read(iprot)
-                        self.reservations.append(_elem18)
-                    iprot.readListEnd()
+                if ftype == TType.STRUCT:
+                    self.specificPreferences = EnvironmentSpecificPreferences()
+                    self.specificPreferences.read(iprot)
                 else:
                     iprot.skip(ftype)
             else:
@@ -422,59 +685,29 @@ class GroupComputeResourcePreference(object):
             oprot.writeFieldBegin('loginUserName', TType.STRING, 4)
             oprot.writeString(self.loginUserName.encode('utf-8') if sys.version_info[0] == 2 else self.loginUserName)
             oprot.writeFieldEnd()
+        if self.scratchLocation is not None:
+            oprot.writeFieldBegin('scratchLocation', TType.STRING, 5)
+            oprot.writeString(self.scratchLocation.encode('utf-8') if sys.version_info[0] == 2 else self.scratchLocation)
+            oprot.writeFieldEnd()
         if self.preferredJobSubmissionProtocol is not None:
-            oprot.writeFieldBegin('preferredJobSubmissionProtocol', TType.I32, 5)
+            oprot.writeFieldBegin('preferredJobSubmissionProtocol', TType.I32, 6)
             oprot.writeI32(self.preferredJobSubmissionProtocol.value)
             oprot.writeFieldEnd()
         if self.preferredDataMovementProtocol is not None:
-            oprot.writeFieldBegin('preferredDataMovementProtocol', TType.I32, 6)
+            oprot.writeFieldBegin('preferredDataMovementProtocol', TType.I32, 7)
             oprot.writeI32(self.preferredDataMovementProtocol.value)
             oprot.writeFieldEnd()
-        if self.preferredBatchQueue is not None:
-            oprot.writeFieldBegin('preferredBatchQueue', TType.STRING, 7)
-            oprot.writeString(self.preferredBatchQueue.encode('utf-8') if sys.version_info[0] == 2 else self.preferredBatchQueue)
-            oprot.writeFieldEnd()
-        if self.scratchLocation is not None:
-            oprot.writeFieldBegin('scratchLocation', TType.STRING, 8)
-            oprot.writeString(self.scratchLocation.encode('utf-8') if sys.version_info[0] == 2 else self.scratchLocation)
-            oprot.writeFieldEnd()
-        if self.allocationProjectNumber is not None:
-            oprot.writeFieldBegin('allocationProjectNumber', TType.STRING, 9)
-            oprot.writeString(self.allocationProjectNumber.encode('utf-8') if sys.version_info[0] == 2 else self.allocationProjectNumber)
-            oprot.writeFieldEnd()
         if self.resourceSpecificCredentialStoreToken is not None:
-            oprot.writeFieldBegin('resourceSpecificCredentialStoreToken', TType.STRING, 10)
+            oprot.writeFieldBegin('resourceSpecificCredentialStoreToken', TType.STRING, 8)
             oprot.writeString(self.resourceSpecificCredentialStoreToken.encode('utf-8') if sys.version_info[0] == 2 else self.resourceSpecificCredentialStoreToken)
             oprot.writeFieldEnd()
-        if self.usageReportingGatewayId is not None:
-            oprot.writeFieldBegin('usageReportingGatewayId', TType.STRING, 11)
-            oprot.writeString(self.usageReportingGatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.usageReportingGatewayId)
-            oprot.writeFieldEnd()
-        if self.qualityOfService is not None:
-            oprot.writeFieldBegin('qualityOfService', TType.STRING, 12)
-            oprot.writeString(self.qualityOfService.encode('utf-8') if sys.version_info[0] == 2 else self.qualityOfService)
-            oprot.writeFieldEnd()
-        if self.sshAccountProvisioner is not None:
-            oprot.writeFieldBegin('sshAccountProvisioner', TType.STRING, 16)
-            oprot.writeString(self.sshAccountProvisioner.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisioner)
-            oprot.writeFieldEnd()
-        if self.groupSSHAccountProvisionerConfigs is not None:
-            oprot.writeFieldBegin('groupSSHAccountProvisionerConfigs', TType.LIST, 17)
-            oprot.writeListBegin(TType.STRUCT, len(self.groupSSHAccountProvisionerConfigs))
-            for iter19 in self.groupSSHAccountProvisionerConfigs:
-                iter19.write(oprot)
-            oprot.writeListEnd()
+        if self.resourceType is not None:
+            oprot.writeFieldBegin('resourceType', TType.I32, 9)
+            oprot.writeI32(self.resourceType.value)
             oprot.writeFieldEnd()
-        if self.sshAccountProvisionerAdditionalInfo is not None:
-            oprot.writeFieldBegin('sshAccountProvisionerAdditionalInfo', TType.STRING, 18)
-            oprot.writeString(self.sshAccountProvisionerAdditionalInfo.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisionerAdditionalInfo)
-            oprot.writeFieldEnd()
-        if self.reservations is not None:
-            oprot.writeFieldBegin('reservations', TType.LIST, 19)
-            oprot.writeListBegin(TType.STRUCT, len(self.reservations))
-            for iter20 in self.reservations:
-                iter20.write(oprot)
-            oprot.writeListEnd()
+        if self.specificPreferences is not None:
+            oprot.writeFieldBegin('specificPreferences', TType.STRUCT, 10)
+            self.specificPreferences.write(oprot)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -486,6 +719,8 @@ class GroupComputeResourcePreference(object):
             raise TProtocolException(message='Required field groupResourceProfileId is unset!')
         if self.overridebyAiravata is None:
             raise TProtocolException(message='Required field overridebyAiravata is unset!')
+        if self.resourceType is None:
+            raise TProtocolException(message='Required field resourceType is unset!')
         return
 
     def __repr__(self):
@@ -950,6 +1185,31 @@ ComputeResourceReservation.thrift_spec = (
     (4, TType.I64, 'startTime', None, None, ),  # 4
     (5, TType.I64, 'endTime', None, None, ),  # 5
 )
+all_structs.append(SlurmComputeResourcePreference)
+SlurmComputeResourcePreference.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'allocationProjectNumber', 'UTF8', None, ),  # 1
+    (2, TType.STRING, 'preferredBatchQueue', 'UTF8', None, ),  # 2
+    (3, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 3
+    (4, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 4
+    (5, TType.STRING, 'sshAccountProvisioner', 'UTF8', None, ),  # 5
+    (6, TType.LIST, 'groupSSHAccountProvisionerConfigs', (TType.STRUCT, [GroupAccountSSHProvisionerConfig, None], False), None, ),  # 6
+    (7, TType.STRING, 'sshAccountProvisionerAdditionalInfo', 'UTF8', None, ),  # 7
+    (8, TType.LIST, 'reservations', (TType.STRUCT, [ComputeResourceReservation, None], False), None, ),  # 8
+)
+all_structs.append(AwsComputeResourcePreference)
+AwsComputeResourcePreference.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'region', 'UTF8', None, ),  # 1
+    (2, TType.STRING, 'preferredAmiId', 'UTF8', None, ),  # 2
+    (3, TType.STRING, 'preferredInstanceType', 'UTF8', None, ),  # 3
+)
+all_structs.append(EnvironmentSpecificPreferences)
+EnvironmentSpecificPreferences.thrift_spec = (
+    None,  # 0
+    (1, TType.STRUCT, 'slurm', [SlurmComputeResourcePreference, None], None, ),  # 1
+    (2, TType.STRUCT, 'aws', [AwsComputeResourcePreference, None], None, ),  # 2
+)
 all_structs.append(GroupComputeResourcePreference)
 GroupComputeResourcePreference.thrift_spec = (
     None,  # 0
@@ -957,21 +1217,12 @@ GroupComputeResourcePreference.thrift_spec = (
     (2, TType.STRING, 'groupResourceProfileId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 2
     (3, TType.BOOL, 'overridebyAiravata', None, True, ),  # 3
     (4, TType.STRING, 'loginUserName', 'UTF8', None, ),  # 4
-    (5, TType.I32, 'preferredJobSubmissionProtocol', None, None, ),  # 5
-    (6, TType.I32, 'preferredDataMovementProtocol', None, None, ),  # 6
-    (7, TType.STRING, 'preferredBatchQueue', 'UTF8', None, ),  # 7
-    (8, TType.STRING, 'scratchLocation', 'UTF8', None, ),  # 8
-    (9, TType.STRING, 'allocationProjectNumber', 'UTF8', None, ),  # 9
-    (10, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 10
-    (11, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 11
-    (12, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 12
-    None,  # 13
-    None,  # 14
-    None,  # 15
-    (16, TType.STRING, 'sshAccountProvisioner', 'UTF8', None, ),  # 16
-    (17, TType.LIST, 'groupSSHAccountProvisionerConfigs', (TType.STRUCT, [GroupAccountSSHProvisionerConfig, None], False), None, ),  # 17
-    (18, TType.STRING, 'sshAccountProvisionerAdditionalInfo', 'UTF8', None, ),  # 18
-    (19, TType.LIST, 'reservations', (TType.STRUCT, [ComputeResourceReservation, None], False), None, ),  # 19
+    (5, TType.STRING, 'scratchLocation', 'UTF8', None, ),  # 5
+    (6, TType.I32, 'preferredJobSubmissionProtocol', None, None, ),  # 6
+    (7, TType.I32, 'preferredDataMovementProtocol', None, None, ),  # 7
+    (8, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 8
+    (9, TType.I32, 'resourceType', None, None, ),  # 9
+    (10, TType.STRUCT, 'specificPreferences', [EnvironmentSpecificPreferences, None], None, ),  # 10
 )
 all_structs.append(ComputeResourcePolicy)
 ComputeResourcePolicy.thrift_spec = (
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parallelism/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/parser/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/storageresource/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py
index 89f2523a99..c3c39c1d94 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/appcatalog/userresourceprofile/ttypes.py
@@ -15,9 +15,6 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.appcatalog.computeresource.ttypes
-import airavata.model.data.movement.ttypes
-import airavata.model.user.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/application/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/application/__init__.py
index d5d826e6e4..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/application/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/application/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import io
diff --git a/dev-tools/airavata-python-sdk/airavata/model/application/io/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/application/io/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/application/io/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/application/io/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/application/io/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/application/io/ttypes.py
index 7c0533e347..7b2df40ec4 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/application/io/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/application/io/ttypes.py
@@ -15,7 +15,6 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.appcatalog.computeresource.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/commons/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/commons/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/commons/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/commons/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/credential/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/credential/__init__.py
index ec03c45cea..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/credential/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/credential/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import store
diff --git a/dev-tools/airavata-python-sdk/airavata/model/credential/store/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/credential/store/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/credential/store/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/credential/store/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/data/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/data/__init__.py
index 65c4413df6..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/data/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/data/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import movement, replica
diff --git a/dev-tools/airavata-python-sdk/airavata/model/data/movement/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/data/movement/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/data/movement/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/data/movement/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/data/replica/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/data/replica/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/data/replica/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/data/replica/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/dbevent/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/dbevent/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/dbevent/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/dbevent/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/experiment/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/experiment/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/experiment/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/experiment/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/group/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/group/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/group/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/group/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/group/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/group/ttypes.py
index fa9aa7f33d..3b297f307a 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/group/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/group/ttypes.py
@@ -15,7 +15,6 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.commons.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/job/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/job/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/job/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/job/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/messaging/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/messaging/__init__.py
index e75c1502fb..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/messaging/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/messaging/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import event
diff --git a/dev-tools/airavata-python-sdk/airavata/model/messaging/event/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/messaging/event/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/messaging/event/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/messaging/event/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/messaging/event/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/messaging/event/ttypes.py
index 61163301d4..97ec7bbf09 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/messaging/event/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/messaging/event/ttypes.py
@@ -15,9 +15,9 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.model.commons.ttypes
 import airavata.model.status.ttypes
 import airavata.model.application.io.ttypes
-import airavata.model.commons.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/process/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/process/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/process/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/process/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/process/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/process/ttypes.py
index 8999075533..554d422c49 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/process/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/process/ttypes.py
@@ -17,9 +17,9 @@ from enum import IntEnum
 import sys
 import airavata.model.commons.ttypes
 import airavata.model.application.io.ttypes
+import airavata.model.scheduling.ttypes
 import airavata.model.status.ttypes
 import airavata.model.task.ttypes
-import airavata.model.scheduling.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/scheduling/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/scheduling/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/scheduling/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/scheduling/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/security/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/security/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/security/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/security/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/sharing/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/sharing/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/sharing/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/sharing/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/status/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/status/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/status/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/status/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/task/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/task/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/task/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/task/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/task/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/task/ttypes.py
index ed300e89f4..bad948b3a8 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/task/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/task/ttypes.py
@@ -16,11 +16,11 @@ from enum import IntEnum
 
 import sys
 import airavata.model.commons.ttypes
+import airavata.model.application.io.ttypes
 import airavata.model.appcatalog.computeresource.ttypes
 import airavata.model.data.movement.ttypes
-import airavata.model.application.io.ttypes
-import airavata.model.status.ttypes
 import airavata.model.job.ttypes
+import airavata.model.status.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/tenant/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/tenant/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/tenant/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/tenant/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/tenant/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/tenant/ttypes.py
index 981f466ae6..b28c7832b3 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/tenant/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/tenant/ttypes.py
@@ -15,7 +15,6 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
-import airavata.model.commons.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/model/ttypes.py b/dev-tools/airavata-python-sdk/airavata/model/ttypes.py
index b74486a39d..b90a3c4dd0 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/ttypes.py
@@ -15,27 +15,759 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.model.application.io.ttypes
 import airavata.model.commons.ttypes
-import airavata.model.workspace.ttypes
-import airavata.api.error.ttypes
-import airavata.model.messaging.event.ttypes
-import airavata.model.security.ttypes
-import airavata.model.dbevent.ttypes
-import airavata.model.experiment.ttypes
-import airavata.model.job.ttypes
-import airavata.model.task.ttypes
-import airavata.model.process.ttypes
-import airavata.model.scheduling.ttypes
-import airavata.model.status.ttypes
-import airavata.model.data.movement.ttypes
-import airavata.model.data.replica.ttypes
-import airavata.model.user.ttypes
-import airavata.model.group.ttypes
-import airavata.model.tenant.ttypes
-import airavata.model.credential.store.ttypes
-import airavata.model.appcatalog.gatewaygroups.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
+
+
+class WorkflowState(IntEnum):
+    CREATED = 0
+    STARTED = 1
+    EXECUTING = 2
+    COMPLETED = 3
+    FAILED = 4
+    CANCELLING = 5
+    CANCELED = 6
+
+
+
+class ComponentState(IntEnum):
+    CREATED = 0
+    WAITING = 1
+    READY = 2
+    RUNNING = 3
+    COMPLETED = 4
+    FAILED = 5
+    CANCELED = 6
+
+
+
+class WorkflowModel(object):
+    """
+    Attributes:
+     - templateId
+     - name
+     - graph
+     - gatewayId
+     - createdUser
+     - image
+     - workflowInputs
+     - workflowOutputs
+     - creationTime
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, templateId: str = "DO_NOT_SET_AT_CLIENTS", name: str = None, graph: str = None, gatewayId: str = None, createdUser: str = None, image: typing.Optional[bytes] = None, workflowInputs: typing.Optional[list[airavata.model.application.io.ttypes.InputDataObjectType]] = None, workflowOutputs: typing.Optional[list[airavata.model.application.io.ttypes.OutputDataObjectType]] = None, creationTime: typing.Optional[int] = None,):
+        self.templateId: str = templateId
+        self.name: str = name
+        self.graph: str = graph
+        self.gatewayId: str = gatewayId
+        self.createdUser: str = createdUser
+        self.image: typing.Optional[bytes] = image
+        self.workflowInputs: typing.Optional[list[airavata.model.application.io.ttypes.InputDataObjectType]] = workflowInputs
+        self.workflowOutputs: typing.Optional[list[airavata.model.application.io.ttypes.OutputDataObjectType]] = workflowOutputs
+        self.creationTime: typing.Optional[int] = creationTime
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.templateId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.graph = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.STRING:
+                    self.createdUser = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.image = iprot.readBinary()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 7:
+                if ftype == TType.LIST:
+                    self.workflowInputs = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = airavata.model.application.io.ttypes.InputDataObjectType()
+                        _elem5.read(iprot)
+                        self.workflowInputs.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 8:
+                if ftype == TType.LIST:
+                    self.workflowOutputs = []
+                    (_etype9, _size6) = iprot.readListBegin()
+                    for _i10 in range(_size6):
+                        _elem11 = airavata.model.application.io.ttypes.OutputDataObjectType()
+                        _elem11.read(iprot)
+                        self.workflowOutputs.append(_elem11)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 9:
+                if ftype == TType.I64:
+                    self.creationTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('WorkflowModel')
+        if self.templateId is not None:
+            oprot.writeFieldBegin('templateId', TType.STRING, 1)
+            oprot.writeString(self.templateId.encode('utf-8') if sys.version_info[0] == 2 else self.templateId)
+            oprot.writeFieldEnd()
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 2)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.graph is not None:
+            oprot.writeFieldBegin('graph', TType.STRING, 3)
+            oprot.writeString(self.graph.encode('utf-8') if sys.version_info[0] == 2 else self.graph)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 4)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        if self.createdUser is not None:
+            oprot.writeFieldBegin('createdUser', TType.STRING, 5)
+            oprot.writeString(self.createdUser.encode('utf-8') if sys.version_info[0] == 2 else self.createdUser)
+            oprot.writeFieldEnd()
+        if self.image is not None:
+            oprot.writeFieldBegin('image', TType.STRING, 6)
+            oprot.writeBinary(self.image)
+            oprot.writeFieldEnd()
+        if self.workflowInputs is not None:
+            oprot.writeFieldBegin('workflowInputs', TType.LIST, 7)
+            oprot.writeListBegin(TType.STRUCT, len(self.workflowInputs))
+            for iter12 in self.workflowInputs:
+                iter12.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.workflowOutputs is not None:
+            oprot.writeFieldBegin('workflowOutputs', TType.LIST, 8)
+            oprot.writeListBegin(TType.STRUCT, len(self.workflowOutputs))
+            for iter13 in self.workflowOutputs:
+                iter13.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.creationTime is not None:
+            oprot.writeFieldBegin('creationTime', TType.I64, 9)
+            oprot.writeI64(self.creationTime)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.templateId is None:
+            raise TProtocolException(message='Required field templateId is unset!')
+        if self.name is None:
+            raise TProtocolException(message='Required field name is unset!')
+        if self.graph is None:
+            raise TProtocolException(message='Required field graph is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        if self.createdUser is None:
+            raise TProtocolException(message='Required field createdUser is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class ComponentStatus(object):
+    """
+    Attributes:
+     - state
+     - reason
+     - timeofStateChange
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, state: ComponentState =     ComponentState.CREATED, reason: typing.Optional[str] = None, timeofStateChange: typing.Optional[int] = None,):
+        self.state: ComponentState = state
+        self.reason: typing.Optional[str] = reason
+        self.timeofStateChange: typing.Optional[int] = timeofStateChange
+
+    def __setattr__(self, name, value):
+        if name == "state":
+            super().__setattr__(name, value if hasattr(value, 'value') else ComponentState.__members__.get(value))
+            return
+        super().__setattr__(name, value)
+
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.state = ComponentState(iprot.readI32())
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.reason = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.I64:
+                    self.timeofStateChange = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('ComponentStatus')
+        if self.state is not None:
+            oprot.writeFieldBegin('state', TType.I32, 1)
+            oprot.writeI32(self.state.value)
+            oprot.writeFieldEnd()
+        if self.reason is not None:
+            oprot.writeFieldBegin('reason', TType.STRING, 2)
+            oprot.writeString(self.reason.encode('utf-8') if sys.version_info[0] == 2 else self.reason)
+            oprot.writeFieldEnd()
+        if self.timeofStateChange is not None:
+            oprot.writeFieldBegin('timeofStateChange', TType.I64, 3)
+            oprot.writeI64(self.timeofStateChange)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.state is None:
+            raise TProtocolException(message='Required field state is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class WorkflowStatus(object):
+    """
+    Attributes:
+     - state
+     - timeOfStateChange
+     - reason
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, state: WorkflowState = None, timeOfStateChange: typing.Optional[int] = None, reason: typing.Optional[str] = None,):
+        self.state: WorkflowState = state
+        self.timeOfStateChange: typing.Optional[int] = timeOfStateChange
+        self.reason: typing.Optional[str] = reason
+
+    def __setattr__(self, name, value):
+        if name == "state":
+            super().__setattr__(name, value if hasattr(value, 'value') else WorkflowState.__members__.get(value))
+            return
+        super().__setattr__(name, value)
+
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.state = WorkflowState(iprot.readI32())
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I64:
+                    self.timeOfStateChange = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.reason = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('WorkflowStatus')
+        if self.state is not None:
+            oprot.writeFieldBegin('state', TType.I32, 1)
+            oprot.writeI32(self.state.value)
+            oprot.writeFieldEnd()
+        if self.timeOfStateChange is not None:
+            oprot.writeFieldBegin('timeOfStateChange', TType.I64, 2)
+            oprot.writeI64(self.timeOfStateChange)
+            oprot.writeFieldEnd()
+        if self.reason is not None:
+            oprot.writeFieldBegin('reason', TType.STRING, 3)
+            oprot.writeString(self.reason.encode('utf-8') if sys.version_info[0] == 2 else self.reason)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.state is None:
+            raise TProtocolException(message='Required field state is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class EdgeModel(object):
+    """
+    Attributes:
+     - edgeId
+     - name
+     - status
+     - description
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, edgeId: str = "DO_NOT_SET_AT_CLIENTS", name: typing.Optional[str] = None, status: typing.Optional[ComponentStatus] = None, description: typing.Optional[str] = None,):
+        self.edgeId: str = edgeId
+        self.name: typing.Optional[str] = name
+        self.status: typing.Optional[ComponentStatus] = status
+        self.description: typing.Optional[str] = description
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.edgeId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.status = ComponentStatus()
+                    self.status.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.description = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('EdgeModel')
+        if self.edgeId is not None:
+            oprot.writeFieldBegin('edgeId', TType.STRING, 1)
+            oprot.writeString(self.edgeId.encode('utf-8') if sys.version_info[0] == 2 else self.edgeId)
+            oprot.writeFieldEnd()
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 2)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.status is not None:
+            oprot.writeFieldBegin('status', TType.STRUCT, 3)
+            self.status.write(oprot)
+            oprot.writeFieldEnd()
+        if self.description is not None:
+            oprot.writeFieldBegin('description', TType.STRING, 4)
+            oprot.writeString(self.description.encode('utf-8') if sys.version_info[0] == 2 else self.description)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.edgeId is None:
+            raise TProtocolException(message='Required field edgeId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class PortModel(object):
+    """
+    Attributes:
+     - portId
+     - name
+     - status
+     - value
+     - description
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, portId: str = "DO_NOT_SET_AT_CLIENTS", name: typing.Optional[str] = None, status: typing.Optional[ComponentStatus] = None, value: typing.Optional[str] = None, description: typing.Optional[str] = None,):
+        self.portId: str = portId
+        self.name: typing.Optional[str] = name
+        self.status: typing.Optional[ComponentStatus] = status
+        self.value: typing.Optional[str] = value
+        self.description: typing.Optional[str] = description
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.portId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.status = ComponentStatus()
+                    self.status.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.value = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.STRING:
+                    self.description = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('PortModel')
+        if self.portId is not None:
+            oprot.writeFieldBegin('portId', TType.STRING, 1)
+            oprot.writeString(self.portId.encode('utf-8') if sys.version_info[0] == 2 else self.portId)
+            oprot.writeFieldEnd()
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 2)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.status is not None:
+            oprot.writeFieldBegin('status', TType.STRUCT, 3)
+            self.status.write(oprot)
+            oprot.writeFieldEnd()
+        if self.value is not None:
+            oprot.writeFieldBegin('value', TType.STRING, 4)
+            oprot.writeString(self.value.encode('utf-8') if sys.version_info[0] == 2 else self.value)
+            oprot.writeFieldEnd()
+        if self.description is not None:
+            oprot.writeFieldBegin('description', TType.STRING, 5)
+            oprot.writeString(self.description.encode('utf-8') if sys.version_info[0] == 2 else self.description)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.portId is None:
+            raise TProtocolException(message='Required field portId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class NodeModel(object):
+    """
+    Attributes:
+     - nodeId
+     - name
+     - applicationId
+     - applicationName
+     - status
+     - description
+
+    """
+    thrift_spec: typing.Any = None
+
+
+    def __init__(self, nodeId: str = "DO_NOT_SET_AT_CLIENTS", name: typing.Optional[str] = None, applicationId: typing.Optional[str] = None, applicationName: typing.Optional[str] = None, status: typing.Optional[ComponentStatus] = None, description: typing.Optional[str] = None,):
+        self.nodeId: str = nodeId
+        self.name: typing.Optional[str] = name
+        self.applicationId: typing.Optional[str] = applicationId
+        self.applicationName: typing.Optional[str] = applicationName
+        self.status: typing.Optional[ComponentStatus] = status
+        self.description: typing.Optional[str] = description
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.nodeId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.applicationId = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRING:
+                    self.applicationName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.STRUCT:
+                    self.status = ComponentStatus()
+                    self.status.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.description = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        self.validate()
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
+            return
+        oprot.writeStructBegin('NodeModel')
+        if self.nodeId is not None:
+            oprot.writeFieldBegin('nodeId', TType.STRING, 1)
+            oprot.writeString(self.nodeId.encode('utf-8') if sys.version_info[0] == 2 else self.nodeId)
+            oprot.writeFieldEnd()
+        if self.name is not None:
+            oprot.writeFieldBegin('name', TType.STRING, 2)
+            oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name)
+            oprot.writeFieldEnd()
+        if self.applicationId is not None:
+            oprot.writeFieldBegin('applicationId', TType.STRING, 3)
+            oprot.writeString(self.applicationId.encode('utf-8') if sys.version_info[0] == 2 else self.applicationId)
+            oprot.writeFieldEnd()
+        if self.applicationName is not None:
+            oprot.writeFieldBegin('applicationName', TType.STRING, 4)
+            oprot.writeString(self.applicationName.encode('utf-8') if sys.version_info[0] == 2 else self.applicationName)
+            oprot.writeFieldEnd()
+        if self.status is not None:
+            oprot.writeFieldBegin('status', TType.STRUCT, 5)
+            self.status.write(oprot)
+            oprot.writeFieldEnd()
+        if self.description is not None:
+            oprot.writeFieldBegin('description', TType.STRING, 6)
+            oprot.writeString(self.description.encode('utf-8') if sys.version_info[0] == 2 else self.description)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.nodeId is None:
+            raise TProtocolException(message='Required field nodeId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+all_structs.append(WorkflowModel)
+WorkflowModel.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'templateId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+    (2, TType.STRING, 'name', 'UTF8', None, ),  # 2
+    (3, TType.STRING, 'graph', 'UTF8', None, ),  # 3
+    (4, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 4
+    (5, TType.STRING, 'createdUser', 'UTF8', None, ),  # 5
+    (6, TType.STRING, 'image', 'BINARY', None, ),  # 6
+    (7, TType.LIST, 'workflowInputs', (TType.STRUCT, [airavata.model.application.io.ttypes.InputDataObjectType, None], False), None, ),  # 7
+    (8, TType.LIST, 'workflowOutputs', (TType.STRUCT, [airavata.model.application.io.ttypes.OutputDataObjectType, None], False), None, ),  # 8
+    (9, TType.I64, 'creationTime', None, None, ),  # 9
+)
+all_structs.append(ComponentStatus)
+ComponentStatus.thrift_spec = (
+    None,  # 0
+    (1, TType.I32, 'state', None,     ComponentState.CREATED, ),  # 1
+    (2, TType.STRING, 'reason', 'UTF8', None, ),  # 2
+    (3, TType.I64, 'timeofStateChange', None, None, ),  # 3
+)
+all_structs.append(WorkflowStatus)
+WorkflowStatus.thrift_spec = (
+    None,  # 0
+    (1, TType.I32, 'state', None, None, ),  # 1
+    (2, TType.I64, 'timeOfStateChange', None, None, ),  # 2
+    (3, TType.STRING, 'reason', 'UTF8', None, ),  # 3
+)
+all_structs.append(EdgeModel)
+EdgeModel.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'edgeId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+    (2, TType.STRING, 'name', 'UTF8', None, ),  # 2
+    (3, TType.STRUCT, 'status', [ComponentStatus, None], None, ),  # 3
+    (4, TType.STRING, 'description', 'UTF8', None, ),  # 4
+)
+all_structs.append(PortModel)
+PortModel.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'portId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+    (2, TType.STRING, 'name', 'UTF8', None, ),  # 2
+    (3, TType.STRUCT, 'status', [ComponentStatus, None], None, ),  # 3
+    (4, TType.STRING, 'value', 'UTF8', None, ),  # 4
+    (5, TType.STRING, 'description', 'UTF8', None, ),  # 5
+)
+all_structs.append(NodeModel)
+NodeModel.thrift_spec = (
+    None,  # 0
+    (1, TType.STRING, 'nodeId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+    (2, TType.STRING, 'name', 'UTF8', None, ),  # 2
+    (3, TType.STRING, 'applicationId', 'UTF8', None, ),  # 3
+    (4, TType.STRING, 'applicationName', 'UTF8', None, ),  # 4
+    (5, TType.STRUCT, 'status', [ComponentStatus, None], None, ),  # 5
+    (6, TType.STRING, 'description', 'UTF8', None, ),  # 6
+)
 fix_spec(all_structs)
 del all_structs
diff --git a/dev-tools/airavata-python-sdk/airavata/model/user/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/user/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/user/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/user/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/workflow/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/workflow/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/workflow/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/workflow/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/model/workspace/__init__.py b/dev-tools/airavata-python-sdk/airavata/model/workspace/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/model/workspace/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/model/workspace/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/__init__.py
index a1fb9f8170..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import profile
\ No newline at end of file
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/__init__.py
index a56a10f33a..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/__init__.py
@@ -1,6 +0,0 @@
-__all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import groupmanager, iam, tenant, user, ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py
index 83b54ad908..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import cpi
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py
index 1566ac223f..54b6619724 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'GroupManagerService']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import error, constants, GroupManagerService, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py
index 342510d304..1c5cf8709b 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/groupmanager/cpi/ttypes.py
@@ -15,11 +15,11 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.service.profile.groupmanager.cpi.error.ttypes
 import airavata.api.error.ttypes
 import airavata.model.security.ttypes
-import airavata.model.group.ttypes
-import airavata.service.profile.groupmanager.cpi.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.group.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/__init__.py
index adcffe1769..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import admin
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py
index 5b894e751a..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import services
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py
index 83b54ad908..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import cpi
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py
index ae24fd0d07..58a44a7008 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'IamAdminServices']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import error, constants, IamAdminServices, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py
index 002a9617b5..9474c0b659 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/iam/admin/services/cpi/ttypes.py
@@ -15,13 +15,13 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.service.profile.iam.admin.services.cpi.error.ttypes
 import airavata.api.error.ttypes
 import airavata.model.security.ttypes
-import airavata.model.workspace.ttypes
-import airavata.model.user.ttypes
-import airavata.model.credential.store.ttypes
-import airavata.service.profile.iam.admin.services.cpi.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.credential.store.ttypes
+import airavata.model.user.ttypes
+import airavata.model.workspace.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/__init__.py
index 83b54ad908..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import cpi
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py
index 11598036b8..491c65a457 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'TenantProfileService']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import error, constants, TenantProfileService, ttypes
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
index 7092d0d2a2..32e1753424 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/tenant/cpi/ttypes.py
@@ -15,11 +15,11 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.service.profile.tenant.cpi.error.ttypes
 import airavata.api.error.ttypes
 import airavata.model.security.ttypes
-import airavata.model.workspace.ttypes
-import airavata.service.profile.tenant.cpi.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.workspace.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/ttypes.py b/dev-tools/airavata-python-sdk/airavata/service/profile/ttypes.py
deleted file mode 100644
index 6800f2816b..0000000000
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/ttypes.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# Autogenerated by Thrift Compiler (0.21.0)
-#
-# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
-#
-#  options string: py:enum,type_hints
-#
-
-from __future__ import annotations
-import typing
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
-from thrift.protocol.TProtocol import TProtocolException
-from thrift.TRecursive import fix_spec
-from uuid import UUID
-from enum import IntEnum
-
-import sys
-import airavata.service.profile.user.cpi.ttypes
-import airavata.service.profile.tenant.cpi.ttypes
-import airavata.service.profile.iam.admin.services.cpi.ttypes
-import airavata.service.profile.groupmanager.cpi.ttypes
-import airavata.base.api.ttypes
-
-from thrift.transport import TTransport
-all_structs = []
-fix_spec(all_structs)
-del all_structs
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/user/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/user/__init__.py
index 83b54ad908..e69de29bb2 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/user/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/user/__init__.py
@@ -1,4 +0,0 @@
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import cpi
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py
index e3f9ad0f59..8e170a01f6 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants', 'UserProfileService']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import error, constants, ttypes, UserProfileService
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py
index 1e3cc4b787..adefd8e51f 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/error/__init__.py
@@ -1,6 +1 @@
 __all__ = ['ttypes', 'constants']
-
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
-    from . import ttypes, constants
diff --git a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py
index f772562d78..8c2b9225c1 100644
--- a/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py
+++ b/dev-tools/airavata-python-sdk/airavata/service/profile/user/cpi/ttypes.py
@@ -15,11 +15,11 @@ from uuid import UUID
 from enum import IntEnum
 
 import sys
+import airavata.service.profile.user.cpi.error.ttypes
 import airavata.api.error.ttypes
 import airavata.model.security.ttypes
-import airavata.model.user.ttypes
-import airavata.service.profile.user.cpi.error.ttypes
 import airavata.base.api.ttypes
+import airavata.model.user.ttypes
 
 from thrift.transport import TTransport
 all_structs = []
diff --git a/dev-tools/airavata-python-sdk/pyproject.toml b/dev-tools/airavata-python-sdk/pyproject.toml
index 0b775d8384..402e43f420 100644
--- a/dev-tools/airavata-python-sdk/pyproject.toml
+++ b/dev-tools/airavata-python-sdk/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "airavata-python-sdk"
-version = "2.1.5"
+version = "2.1.6"
 description = "Apache Airavata Python SDK"
 readme = "README.md"
 license = "Apache-2.0"
diff --git a/thrift-interface-descriptions/stubs_python.thrift b/thrift-interface-descriptions/stubs_python.thrift
new file mode 100644
index 0000000000..d9c8478359
--- /dev/null
+++ b/thrift-interface-descriptions/stubs_python.thrift
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+
+include "base-api/base_api.thrift"
+
+include "data-models/credential_store_models.thrift"
+include "data-models/status_models.thrift"
+include "data-models/job_model.thrift"
+include "data-models/experiment_model.thrift"
+include "data-models/workspace_model.thrift"
+include "data-models/scheduling_model.thrift"
+include "data-models/application_deployment_model.thrift"
+include "data-models/application_interface_model.thrift"
+include "data-models/application_io_models.thrift"
+include "data-models/parser_model.thrift"
+include "data-models/account_provisioning_model.thrift"
+include "data-models/compute_resource_model.thrift"
+include "data-models/storage_resource_model.thrift"
+include "data-models/gateway_resource_profile_model.thrift"
+include "data-models/group_resource_profile_model.thrift"
+include "data-models/user_resource_profile_model.thrift"
+include "data-models/data_movement_models.thrift"
+include "data-models/gateway_groups_model.thrift"
+include "data-models/replica_catalog_models.thrift"
+include "data-models/group_manager_model.thrift"
+include "data-models/tenant_profile_model.thrift"
+include "data-models/user_profile_model.thrift"
+include "data-models/workflow_data_model.thrift"
+include "data-models/sharing_models.thrift"
+
+include "airavata-apis/airavata_api.thrift"
+include "airavata-apis/airavata_commons.thrift"
+include "airavata-apis/airavata_errors.thrift"
+include "airavata-apis/db_event_model.thrift"
+include "airavata-apis/messaging_events.thrift"
+include "airavata-apis/security_model.thrift"
+include "airavata-apis/workflow_api.thrift"
+
+include "service-cpis/credential-store-cpi.thrift"
+include "service-cpis/registry-api.thrift"
+include "service-cpis/orchestrator-cpi.thrift"
+include "service-cpis/sharing_cpi.thrift"
+include "service-cpis/profile-service-cpi.thrift"