From e9f5a6b4ab24166d6429ecc39ac2016372fb3a95 Mon Sep 17 00:00:00 2001 From: OhMaley Date: Thu, 11 Jul 2024 17:06:28 -0400 Subject: [PATCH] Add button for orphan files deletion + API routes and views --- src/apps/analytics/tasks.py | 2 +- src/apps/api/urls.py | 2 + src/apps/api/views/analytics.py | 111 ++++++++++++++++++++++++ src/static/js/ours/client.js | 6 ++ src/static/riot/analytics/analytics.tag | 85 ++++++++++++++++++ 5 files changed, 205 insertions(+), 1 deletion(-) diff --git a/src/apps/analytics/tasks.py b/src/apps/analytics/tasks.py index 776baf05f..89fad6277 100644 --- a/src/apps/analytics/tasks.py +++ b/src/apps/analytics/tasks.py @@ -475,7 +475,7 @@ def create_storage_analytics_snapshot(): # Log the results log_file = ( - "/app/logs/" + + "/app/var/logs/" + "db_storage_inconsistency_" + current_datetime.strftime("%Y%m%d-%H%M%S") + ".log" diff --git a/src/apps/api/urls.py b/src/apps/api/urls.py index f6ae6bce3..517b7c50f 100644 --- a/src/apps/api/urls.py +++ b/src/apps/api/urls.py @@ -67,6 +67,8 @@ path('analytics/storage_usage_history/', analytics.storage_usage_history, name='storage_usage_history'), path('analytics/competitions_usage/', analytics.competitions_usage, name='competitions_usage'), path('analytics/users_usage/', analytics.users_usage, name='users_usage'), + path('analytics/delete_orphan_files/', analytics.delete_orphan_files, name="delete_orphan_files"), + path('analytics/get_orphan_files/', analytics.get_orphan_files, name="get_orphan_files"), # API Docs re_path(r'docs(?P\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'), diff --git a/src/apps/api/views/analytics.py b/src/apps/api/views/analytics.py index 574025c06..449377d1c 100644 --- a/src/apps/api/views/analytics.py +++ b/src/apps/api/views/analytics.py @@ -12,10 +12,13 @@ from competitions.models import Competition, Submission from analytics.models import StorageUsageHistory, CompetitionStorageDataPoint, UserStorageDataPoint from api.serializers.analytics import AnalyticsSerializer +from utils.storage import BundleStorage +import os import datetime import coreapi import pytz +import logging User = get_user_model() @@ -286,3 +289,111 @@ def users_usage(request): } return Response(response, status=status.HTTP_200_OK) + +@api_view(["GET"]) +def get_orphan_files(request): + """ + Get the orphan files based on the last storage analytics + """ + + if not request.user.is_superuser: + raise PermissionDenied(detail="Admin only") + + logger = logging.getLogger(__name__) + + # Find most recent file + most_recent_log_file = get_most_recent_storage_inconsistency_log_file() + if not most_recent_log_file: + logger.warning("No storage inconsistency log file found.") + return Response({"message": "No storage inconsistency log file found."}, status=status.HTTP_404_NOT_FOUND) + + # Get the list of orphan files from the content of the most recent log file + log_folder = "/app/logs/" + orphan_files_path = get_files_path_from_orphan_log_file(os.path.join(log_folder, most_recent_log_file)) + + return Response({"data": orphan_files_path}, status=status.HTTP_200_OK) + +@api_view(["DELETE"]) +def delete_orphan_files(request): + """ + Delete all orphan files from the storage based on the last storage analytics + """ + + if not request.user.is_superuser: + raise PermissionDenied(detail="Admin only") + + logger = logging.getLogger(__name__) + logger.info("Delete orphan files started") + + # The analytics task generates a db_storage_inconsistency_-