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
