chore: api format

This commit is contained in:
Adrián Jesús Peña Rodríguez committed 2025-02-18 16:22:56 +01:00
1 parent 38fb72e819
commit afce5dcf0d
6 files changed
+44 -24

No files matched your search

+7
View File
@@ -31,6 +31,13 @@ VALKEY_PORT=6379
VALKEY_DB=0
# API scan settings
# The path to the directory where scan artifacts should be stored
DJANGO_TMP_OUTPUT_DIRECTORY = "/tmp/prowler_api_output"
# The maximum number of findings to process in a single batch
DJANGO_FINDINGS_BATCH_SIZE = 1000
# The AWS access key to be used when uploading scan artifacts to an S3 bucket
# If left empty, default AWS credentials resolution behavior will be used
DJANGO_ARTIFACTS_AWS_ACCESS_KEY_ID=""
+16 -9
View File
@@ -2182,7 +2182,10 @@ class TestScanViewSet:
with patch("api.v1.views.get_s3_client", side_effect=client_err):
response = authenticated_client.get(url)
assert response.status_code == status.HTTP_403_FORBIDDEN
assert response.data["detail"] == "There is a problem with the AWS credentials."
assert (
response.data["detail"]
== "There is a problem with the AWS credentials."
)
def test_report_s3_get_object_fail(self, authenticated_client, scans_fixture):
"""
@@ -2194,8 +2197,9 @@ class TestScanViewSet:
scan.save()
url = reverse("scan-report", kwargs={"pk": scan.pk})
client_err = ClientError({"Error": {"Code": "NoSuchKey"}}, "get_object")
with patch("api.v1.views.get_s3_client") as mock_get_s3_client, \
patch("api.v1.views.env.str", return_value="bucket"):
with patch("api.v1.views.get_s3_client") as mock_get_s3_client, patch(
"api.v1.views.env.str", return_value="bucket"
):
s3_client = mock_get_s3_client.return_value
s3_client.get_object.side_effect = client_err
response = authenticated_client.get(url)
@@ -2215,8 +2219,9 @@ class TestScanViewSet:
# Create a dummy S3 object with a 'Body' that returns our fake file content
dummy_body = BytesIO(fake_file_content)
dummy_s3_object = {"Body": dummy_body}
with patch("api.v1.views.get_s3_client") as mock_get_s3_client, \
patch("api.v1.views.env.str", return_value="bucket"):
with patch("api.v1.views.get_s3_client") as mock_get_s3_client, patch(
"api.v1.views.env.str", return_value="bucket"
):
s3_client = mock_get_s3_client.return_value
s3_client.get_object.return_value = dummy_s3_object
response = authenticated_client.get(url)
@@ -2252,8 +2257,9 @@ class TestScanViewSet:
scan.output_path = "/path/to/file.zip"
scan.save()
url = reverse("scan-report", kwargs={"pk": scan.pk})
with patch("api.v1.views.glob.glob", return_value=["/path/to/file.zip"]), \
patch("api.v1.views.open", side_effect=IOError):
with patch("api.v1.views.glob.glob", return_value=["/path/to/file.zip"]), patch(
"api.v1.views.open", side_effect=IOError
):
response = authenticated_client.get(url)
assert response.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR
assert response.data["detail"] == "Error reading local file"
@@ -2269,8 +2275,9 @@ class TestScanViewSet:
scan.save()
url = reverse("scan-report", kwargs={"pk": scan.pk})
m_open = mock_open(read_data=fake_file_content)
with patch("api.v1.views.glob.glob", return_value=["/path/to/file.zip"]), \
patch("api.v1.views.open", m_open):
with patch("api.v1.views.glob.glob", return_value=["/path/to/file.zip"]), patch(
"api.v1.views.open", m_open
):
response = authenticated_client.get(url)
assert isinstance(response, HttpResponse)
assert response.status_code == 200
+4 -6
View File
@@ -1,13 +1,11 @@
import glob
import os
import boto3
from allauth.socialaccount.providers.github.views import GitHubOAuth2Adapter
from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from botocore.exceptions import ClientError, NoCredentialsError, ParamValidationError
from celery.result import AsyncResult
from config.env import env
from allauth.socialaccount.providers.github.views import GitHubOAuth2Adapter
from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from celery.result import AsyncResult
from config.settings.social_login import (
GITHUB_OAUTH_CALLBACK_URL,
GOOGLE_OAUTH_CALLBACK_URL,
@@ -18,8 +16,8 @@ from django.contrib.postgres.aggregates import ArrayAgg
from django.contrib.postgres.search import SearchQuery
from django.db import transaction
from django.db.models import Count, F, OuterRef, Prefetch, Q, Subquery, Sum
from django.http import HttpResponse
from django.db.models.functions import Coalesce
from django.http import HttpResponse
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control
@@ -46,6 +44,7 @@ from rest_framework.permissions import SAFE_METHODS
from rest_framework_json_api.views import RelationshipView, Response
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
from tasks.beat import schedule_provider_scan
from tasks.jobs.export import get_s3_client
from tasks.tasks import (
check_provider_connection_task,
delete_provider_task,
@@ -95,7 +94,6 @@ from api.models import (
from api.pagination import ComplianceOverviewPagination
from api.rbac.permissions import Permissions, get_providers, get_role
from api.rls import Tenant
from tasks.jobs.export import get_s3_client
from api.utils import CustomOAuth2Client, validate_invitation
from api.uuid_utils import datetime_to_uuid7
from api.v1.serializers import (
+10 -4
View File
@@ -222,11 +222,17 @@ FINDINGS_MAX_DAYS_IN_RANGE = env.int("DJANGO_FINDINGS_MAX_DAYS_IN_RANGE", 7)
# API export settings
DJANGO_TMP_OUTPUT_DIRECTORY = "/tmp/prowler_api_output"
DJANGO_FINDINGS_BATCH_SIZE = 1000
DJANGO_TMP_OUTPUT_DIRECTORY = env.str(
"DJANGO_TMP_OUTPUT_DIRECTORY", "/tmp/prowler_api_output"
)
DJANGO_FINDINGS_BATCH_SIZE = env.str("DJANGO_FINDINGS_BATCH_SIZE", 1000)
DJANGO_ARTIFACTS_AWS_S3_OUTPUT_BUCKET = env.str("DJANGO_ARTIFACTS_AWS_S3_OUTPUT_BUCKET", "")
DJANGO_ARTIFACTS_AWS_S3_OUTPUT_BUCKET = env.str(
"DJANGO_ARTIFACTS_AWS_S3_OUTPUT_BUCKET", ""
)
DJANGO_ARTIFACTS_AWS_ACCESS_KEY_ID = env.str("DJANGO_ARTIFACTS_AWS_ACCESS_KEY_ID", "")
DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY = env.str("DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY", "")
DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY = env.str(
"DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY", ""
)
DJANGO_ARTIFACTS_AWS_SESSION_TOKEN = env.str("DJANGO_ARTIFACTS_AWS_SESSION_TOKEN", "")
DJANGO_ARTIFACTS_AWS_DEFAULT_REGION = env.str("DJANGO_ARTIFACTS_AWS_DEFAULT_REGION", "")
+1 -3
View File
@@ -75,9 +75,7 @@ def get_s3_client():
s3_client = boto3.client(
"s3",
aws_access_key_id=env.str("DJANGO_ARTIFACTS_AWS_ACCESS_KEY_ID"),
aws_secret_access_key=env.str(
"DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY"
),
aws_secret_access_key=env.str("DJANGO_ARTIFACTS_AWS_SECRET_ACCESS_KEY"),
aws_session_token=env.str("DJANGO_ARTIFACTS_AWS_SESSION_TOKEN"),
region_name=env.str("DJANGO_ARTIFACTS_AWS_DEFAULT_REGION"),
)
+6 -2
View File
@@ -221,7 +221,9 @@ def generate_outputs(scan_id: str, provider_id: str, tenant_id: str):
provider_uid = Provider.objects.get(id=provider_id).uid
# Generate and ensure the output directory exists
output_directory = _generate_output_directory(DJANGO_TMP_OUTPUT_DIRECTORY, provider_uid, tenant_id, scan_id)
output_directory = _generate_output_directory(
DJANGO_TMP_OUTPUT_DIRECTORY, provider_uid, tenant_id, scan_id
)
# Define auxiliary variables
output_writers = {}
@@ -233,7 +235,9 @@ def generate_outputs(scan_id: str, provider_id: str, tenant_id: str):
findings_qs = Finding.objects.filter(scan_id=scan_id).order_by("uid")
# Process findings in batches
for batch, is_last_batch in batched(findings_qs.iterator(), DJANGO_FINDINGS_BATCH_SIZE):
for batch, is_last_batch in batched(
findings_qs.iterator(), DJANGO_FINDINGS_BATCH_SIZE
):
finding_outputs = [
FindingOutput.transform_api_finding(finding) for finding in batch
]