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

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

commit 9e5ccfacff38ae70169103c0268368d898fbafa1
Author: Marcus Christie <[email protected]>
AuthorDate: Mon Apr 17 17:53:43 2023 -0400

    AIRAVATA-3694 REST API and admin view to see when experiment data dir has 
been archived
---
 .../components/statistics/ExperimentDetailsView.vue | 20 +++++++++++++++++++-
 .../apps/api/static/django_airavata_api/js/index.js |  1 +
 .../static/django_airavata_api/js/service_config.js |  9 +++++++++
 django_airavata/apps/api/urls.py                    |  3 +++
 django_airavata/apps/api/views.py                   | 21 ++++++++++++++++++++-
 5 files changed, 52 insertions(+), 2 deletions(-)

diff --git 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
index 18607aac..b2ae0aef 100644
--- 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
+++ 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
@@ -255,7 +255,19 @@
         </tr>
         <tr>
           <th scope="row">Experiment Data Dir</th>
-          <td>{{ experimentDataDir }}</td>
+          <td>
+            <div>{{ experimentDataDir }}</div>
+            <b-alert
+              show
+              variant="warning"
+              v-if="experimentArchive.archived"
+              class="mt-2"
+            >
+              This directory was archived in
+              <b>{{ experimentArchive.archive_name }}</b> on
+              {{ experimentArchive.created_date }}.
+            </b-alert>
+          </td>
         </tr>
         <tr>
           <th scope="row">Errors</th>
@@ -389,6 +401,7 @@ export default {
   data() {
     return {
       fullExperiment: null,
+      experimentArchive: null,
     };
   },
   computed: {
@@ -454,6 +467,11 @@ export default {
     services.FullExperimentService.retrieve({
       lookup: this.experiment.experimentId,
     }).then((fullExperiment) => (this.fullExperiment = fullExperiment));
+    services.ExperimentArchiveService.get({
+      experimentId: this.experiment.experimentId,
+    }).then((result) => {
+      this.experimentArchive = result;
+    });
   },
   methods: {
     getDataProducts(io, collection) {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/index.js 
b/django_airavata/apps/api/static/django_airavata_api/js/index.js
index 008335c6..9cb8a655 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/index.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/index.js
@@ -120,6 +120,7 @@ const services = {
   ComputeResourceService: ServiceFactory.service("ComputeResources"),
   CredentialSummaryService: ServiceFactory.service("CredentialSummaries"),
   DataProductService: ServiceFactory.service("DataProducts"),
+  ExperimentArchiveService: ServiceFactory.service("ExperimentArchive"),
   ExperimentSearchService: ServiceFactory.service("ExperimentSearch"),
   ExperimentService: ServiceFactory.service("Experiments"),
   ExperimentStatisticsService: ServiceFactory.service("ExperimentStatistics"),
diff --git 
a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js 
b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
index c02058d6..73d134f5 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
@@ -202,6 +202,15 @@ export default {
     },
     modelClass: Experiment,
   },
+  ExperimentArchive: {
+    url: "/api/experiment-archives",
+    methods: {
+      get: {
+        url: "/api/experiment-archives/<experimentId>/",
+        requestType: "get",
+      },
+    },
+  },
   ExperimentSearch: {
     url: "/api/experiment-search",
     viewSet: [
diff --git a/django_airavata/apps/api/urls.py b/django_airavata/apps/api/urls.py
index f655d648..474ebca1 100644
--- a/django_airavata/apps/api/urls.py
+++ b/django_airavata/apps/api/urls.py
@@ -107,6 +107,9 @@ urlpatterns = [
             views.image_output_view, name="image-output"),
     re_path(r'^link-output',
             views.link_output_view, name="link-output"),
+    re_path(r'^experiment-archives/(?P<experiment_id>[^/]+)/',
+            views.ExperimentArchiveView.as_view(),
+            name="experiment-archives"),
 ]
 
 urlpatterns = router.urls + format_suffix_patterns(urlpatterns)
diff --git a/django_airavata/apps/api/views.py 
b/django_airavata/apps/api/views.py
index b8f22d87..f44e5e74 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -20,7 +20,10 @@ from airavata.model.data.movement.ttypes import (
     SCPDataMovement,
     UnicoreDataMovement
 )
-from airavata.model.experiment.ttypes import ExperimentSearchFields
+from airavata.model.experiment.ttypes import (
+    ExperimentModel,
+    ExperimentSearchFields
+)
 from airavata.model.group.ttypes import ResourcePermissionType
 from airavata.model.user.ttypes import Status
 from airavata_django_portal_sdk import (
@@ -43,6 +46,7 @@ from rest_framework.renderers import JSONRenderer
 from rest_framework.response import Response
 from rest_framework.views import APIView
 
+from django_airavata.apps.admin.models import UserDataArchiveEntry
 from django_airavata.apps.api.view_utils import (
     APIBackedViewSet,
     APIResultIterator,
@@ -1282,6 +1286,21 @@ class CurrentGatewayResourceProfile(APIView):
             return Response(serializer.errors, 
status=status.HTTP_400_BAD_REQUEST)
 
 
+class ExperimentArchiveView(APIView):
+
+    def get(self, request, experiment_id=None, format=None):
+        experiment: ExperimentModel = 
request.airavata_client.getExperiment(request.authz_token, experiment_id)
+        result = dict(archived=False, archive_name=None, created_date=None)
+        try:
+            archive_entry = 
UserDataArchiveEntry.objects.get(entry_path=experiment.userConfigurationData.experimentDataDir,
 user_data_archive__rolled_back=False)
+            result["archived"] = True
+            result["archive_name"] = 
archive_entry.user_data_archive.archive_name
+            result["created_date"] = 
archive_entry.user_data_archive.created_date
+        except UserDataArchiveEntry.DoesNotExist:
+            pass
+        return Response(result, status=status.HTTP_200_OK)
+
+
 class StorageResourceViewSet(mixins.RetrieveModelMixin,
                              GenericAPIBackedViewSet):
     serializer_class = serializers.StorageResourceSerializer

Reply via email to