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

yasithdev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airavata-portals.git


The following commit(s) were added to refs/heads/main by this push:
     new 2e22ad63b refactor(portal): de-Thrift residual experiment/app-catalog 
read calls to gRPC (Track D) (#189)
2e22ad63b is described below

commit 2e22ad63b826ce950a31d91124f92898796c567b
Author: Yasith Jayawardana <[email protected]>
AuthorDate: Tue Jun 9 01:32:49 2026 -0400

    refactor(portal): de-Thrift residual experiment/app-catalog read calls to 
gRPC (Track D) (#189)
    
    Migrate the remaining straggler Thrift reads (those not entangled with the
    storage/data-product write path) to the gRPC facades + existing adapters:
    
    - FullExperimentViewSet.get_instance: getExperiment / 
getApplicationInterface /
      getApplicationModule / getComputeResource / getProject / getJobDetails /
      userHasAccess -> research/compute facades + adapters and the sharing
      user_has_access helper. (Its data-product reads were already gRPC from 
D4.1.)
    - ApplicationModuleViewSet.application_interface / application_deployments
      actions: getAllApplicationInterfaces / getAllApplicationDeployments ->
      research.get_all_application_interfaces / 
get_accessible_application_deployments
      + adapters, keeping the same module-id filtering.
    - ExperimentViewSet.clone: re-fetch the cloned experiment via
      research.get_experiment (experiment_util.clone stays Thrift 
orchestration).
    - output_views.generate_data: getExperiment -> research.get_experiment.
    - workspace/views.edit_experiment: getExperiment / getApplicationInterface 
->
      research facades (derives app_module_id for template rendering).
    
    After this, the only remaining request.airavata_client call sites are the 
two
    intentionally-deferred admin views (GlobusJobSubmissionView's broken getClo 
and
    UnicoreDataMovementView's missing facade getter), both already flagged with 
TODO.
    
    REST/JSON contract unchanged (reuses the proven D2 adapters). Validated:
    manage.py check clean; all view modules import; the facade calls round-trip
    structurally against the live backend (empty lists / proper errors for 
absent
    data, matching the dev-data limits).
---
 .../django_airavata/apps/api/output_views.py       |  4 +-
 .../django_airavata/apps/api/views.py              | 53 +++++++++++++---------
 .../django_airavata/apps/workspace/views.py        |  6 ++-
 3 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/airavata-django-portal/django_airavata/apps/api/output_views.py 
b/airavata-django-portal/django_airavata/apps/api/output_views.py
index 1d80b3023..67aafa3d1 100644
--- a/airavata-django-portal/django_airavata/apps/api/output_views.py
+++ b/airavata-django-portal/django_airavata/apps/api/output_views.py
@@ -175,8 +175,8 @@ def generate_data(request,
                   **kwargs):
     output_view_provider = _get_output_view_provider(output_view_provider_id)
     # TODO if output_view_provider is None, return 404
-    experiment = request.airavata_client.getExperiment(
-        request.authz_token, experiment_id)
+    experiment = grpc_adapters.experiment(
+        request.airavata.research.get_experiment(experiment_id))
     experiment_output = [o
                          for o in experiment.experimentOutputs
                          if o.name == experiment_output_name]
diff --git a/airavata-django-portal/django_airavata/apps/api/views.py 
b/airavata-django-portal/django_airavata/apps/api/views.py
index 1a3a5bd5b..c08c15beb 100644
--- a/airavata-django-portal/django_airavata/apps/api/views.py
+++ b/airavata-django-portal/django_airavata/apps/api/views.py
@@ -271,9 +271,11 @@ class ExperimentViewSet(mixins.CreateModelMixin,
 
     @action(methods=['post'], detail=True)
     def clone(self, request, experiment_id=None):
+        # experiment_util.clone is the launch/clone orchestration (still 
Thrift);
+        # re-fetch the cloned experiment via gRPC.
         cloned_experiment_id = experiment_util.clone(request, experiment_id)
-        cloned_experiment = request.airavata_client.getExperiment(
-            self.authz_token, cloned_experiment_id)
+        cloned_experiment = grpc_adapters.experiment(
+            request.airavata.research.get_experiment(cloned_experiment_id))
         serializer = self.serializer_class(
             cloned_experiment, context={'request': request})
         return Response(serializer.data)
@@ -347,8 +349,8 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
     def get_instance(self, lookup_value):
         """Get FullExperiment instance with resolved references."""
         # TODO: move loading experiment and references to airavata_sdk?
-        experimentModel = self.request.airavata_client.getExperiment(
-            self.authz_token, lookup_value)
+        experimentModel = grpc_adapters.experiment(
+            self.request.airavata.research.get_experiment(lookup_value))
         outputDataProducts = [
             grpc_adapters.data_product(
                 self.request.airavata.research.get_data_product(output.value))
@@ -368,8 +370,9 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
             if output.value.startswith('airavata-dp')]
         appInterfaceId = experimentModel.executionId
         try:
-            applicationInterface = self.request.airavata_client \
-                .getApplicationInterface(self.authz_token, appInterfaceId)
+            applicationInterface = grpc_adapters.application_interface(
+                self.request.airavata.research.get_application_interface(
+                    appInterfaceId))
         except Exception as e:
             log.warning(f"Failed to load app interface: {e}")
             applicationInterface = None
@@ -396,8 +399,9 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
         try:
             if applicationInterface is not None:
                 appModuleId = applicationInterface.applicationModules[0]
-                applicationModule = self.request.airavata_client \
-                    .getApplicationModule(self.authz_token, appModuleId)
+                applicationModule = grpc_adapters.application_module(
+                    self.request.airavata.research.get_application_module(
+                        appModuleId))
             else:
                 log.warning(
                     "Cannot load application model since app interface failed 
to load")
@@ -410,24 +414,25 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
             comp_res_sched = user_conf.computationalResourceScheduling
             compute_resource_id = comp_res_sched.resourceHostId
         try:
-            compute_resource = self.request.airavata_client.getComputeResource(
-                self.authz_token, compute_resource_id) \
+            compute_resource = grpc_adapters.compute_resource(
+                self.request.airavata.compute.get_compute_resource(
+                    compute_resource_id)) \
                 if compute_resource_id else None
         except Exception:
             log.exception("Failed to load compute resource for {}".format(
                 compute_resource_id), extra={'request': self.request})
             compute_resource = None
-        if self.request.airavata_client.userHasAccess(
-                self.authz_token,
-                experimentModel.projectId,
-                ResourcePermissionType.READ):
-            project = self.request.airavata_client.getProject(
-                self.authz_token, experimentModel.projectId)
+        if serializers.user_has_access(
+                self.request, experimentModel.projectId, 'READ'):
+            project = grpc_adapters.project(
+                self.request.airavata.research.get_project(
+                    experimentModel.projectId))
         else:
             # User may not have access to project, only experiment
             project = None
-        job_details = self.request.airavata_client.getJobDetails(
-            self.authz_token, lookup_value)
+        job_details = [
+            grpc_adapters.job_model(j)
+            for j in 
self.request.airavata.research.get_job_details(lookup_value)]
         full_experiment = serializers.FullExperiment(
             experimentModel,
             project=project,
@@ -472,8 +477,10 @@ class ApplicationModuleViewSet(APIBackedViewSet):
 
     @action(detail=True)
     def application_interface(self, request, app_module_id):
-        all_app_interfaces = 
request.airavata_client.getAllApplicationInterfaces(
-            self.authz_token, self.gateway_id)
+        all_app_interfaces = [
+            grpc_adapters.application_interface(i)
+            for i in request.airavata.research.get_all_application_interfaces(
+                self.gateway_id)]
         app_interfaces = []
         for app_interface in all_app_interfaces:
             if not app_interface.applicationModules:
@@ -498,8 +505,10 @@ class ApplicationModuleViewSet(APIBackedViewSet):
 
     @action(detail=True)
     def application_deployments(self, request, app_module_id):
-        all_deployments = 
self.request.airavata_client.getAllApplicationDeployments(
-            self.authz_token, self.gateway_id)
+        all_deployments = [
+            grpc_adapters.application_deployment(d)
+            for d in self.request.airavata.research
+            .get_accessible_application_deployments(self.gateway_id)]
         app_deployments = [
             dep for dep in all_deployments if dep.appModuleId == app_module_id]
         serializer = serializers.ApplicationDeploymentDescriptionSerializer(
diff --git a/airavata-django-portal/django_airavata/apps/workspace/views.py 
b/airavata-django-portal/django_airavata/apps/workspace/views.py
index 54d7d58fd..a53711ff5 100644
--- a/airavata-django-portal/django_airavata/apps/workspace/views.py
+++ b/airavata-django-portal/django_airavata/apps/workspace/views.py
@@ -132,8 +132,10 @@ def create_experiment(request, app_module_id):
 def edit_experiment(request, experiment_id):
     request.active_nav_item = 'experiments'
 
-    experiment = request.airavata_client.getExperiment(request.authz_token, 
experiment_id)
-    applicationInterface = 
request.airavata_client.getApplicationInterface(request.authz_token, 
experiment.executionId)
+    experiment = grpc_adapters.experiment(
+        request.airavata.research.get_experiment(experiment_id))
+    applicationInterface = grpc_adapters.application_interface(
+        
request.airavata.research.get_application_interface(experiment.executionId))
     app_module_id = applicationInterface.applicationModules[0]
     context = {
         'bundle_name': 'edit-experiment',

Reply via email to