mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-04-14 16:50:04 +00:00
Compare commits
7 Commits
aw-review-
...
PRWLR-7134
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d187b4da0a | ||
|
|
2bdafe7e8c | ||
|
|
d365205e06 | ||
|
|
75da655059 | ||
|
|
5050345beb | ||
|
|
a069042304 | ||
|
|
4156033183 |
71
api/tests/performance/scenarios/resources.py
Normal file
71
api/tests/performance/scenarios/resources.py
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
from locust import task, events
|
||||||
|
from utils.helpers import (
|
||||||
|
APIUserBase,
|
||||||
|
get_api_token,
|
||||||
|
get_auth_headers,
|
||||||
|
get_sort_value,
|
||||||
|
get_available_resource_filters,
|
||||||
|
get_next_resource_filter,
|
||||||
|
)
|
||||||
|
from utils.config import (
|
||||||
|
RESOURCES_UI_SORT_VALUES,
|
||||||
|
)
|
||||||
|
|
||||||
|
GLOBAL = {"token": None, "resource_ids": [], "resource_filters": None}
|
||||||
|
|
||||||
|
|
||||||
|
@events.test_start.add_listener
|
||||||
|
def on_test_start(environment, **kwargs):
|
||||||
|
GLOBAL["token"] = get_api_token(environment.host)
|
||||||
|
GLOBAL["resource_filters"] = get_available_resource_filters(
|
||||||
|
environment.host, GLOBAL["token"]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceUser(APIUserBase):
|
||||||
|
def on_start(self):
|
||||||
|
self.token = GLOBAL["token"]
|
||||||
|
self.headers = get_auth_headers(self.token)
|
||||||
|
self.available_resource_filters = GLOBAL["resource_filters"]
|
||||||
|
|
||||||
|
@task
|
||||||
|
def resources_default(self):
|
||||||
|
name = "GET /resources"
|
||||||
|
page_number = self._next_page(name)
|
||||||
|
endpoint = (
|
||||||
|
f"/resources?page[number]={page_number}"
|
||||||
|
f"&{get_sort_value(RESOURCES_UI_SORT_VALUES)}"
|
||||||
|
)
|
||||||
|
self.client.get(endpoint, headers=get_auth_headers(self.token), name=name)
|
||||||
|
|
||||||
|
@task(3)
|
||||||
|
def resource_with_include(self):
|
||||||
|
name = "GET /resources (with include)"
|
||||||
|
page = self._next_page(name)
|
||||||
|
endpoint = (
|
||||||
|
f"/resources?page[number]={page}"
|
||||||
|
f"&{get_sort_value(RESOURCES_UI_SORT_VALUES)}"
|
||||||
|
f"&include=findings,provider"
|
||||||
|
)
|
||||||
|
self.client.get(endpoint, headers=get_auth_headers(self.token), name=name)
|
||||||
|
|
||||||
|
@task(2)
|
||||||
|
def resource_filter(self):
|
||||||
|
name = "GET /resources (random filter)"
|
||||||
|
filter_type, filter_value = get_next_resource_filter(
|
||||||
|
self.available_resource_filters
|
||||||
|
)
|
||||||
|
endpoint = f"/resources?filter[{filter_type}]={filter_value}"
|
||||||
|
self.client.get(endpoint, headers=get_auth_headers(self.token), name=name)
|
||||||
|
|
||||||
|
@task(2)
|
||||||
|
def resource_filter_with_include(self):
|
||||||
|
name = "GET /resources (random filter + include)"
|
||||||
|
filter_type, filter_value = get_next_resource_filter(
|
||||||
|
self.available_resource_filters
|
||||||
|
)
|
||||||
|
endpoint = (
|
||||||
|
f"/resources?filter[{filter_type}]={filter_value}"
|
||||||
|
f"&include=findings,provider"
|
||||||
|
)
|
||||||
|
self.client.get(endpoint, headers=get_auth_headers(self.token), name=name)
|
||||||
@@ -17,3 +17,6 @@ FINDINGS_RESOURCE_METADATA = {
|
|||||||
S_PROVIDER_NAME = "provider-50k"
|
S_PROVIDER_NAME = "provider-50k"
|
||||||
M_PROVIDER_NAME = "provider-250k"
|
M_PROVIDER_NAME = "provider-250k"
|
||||||
L_PROVIDER_NAME = "provider-500k"
|
L_PROVIDER_NAME = "provider-500k"
|
||||||
|
|
||||||
|
RESOURCES_UI_SORT_VALUES = ["name", "region", "inserted_at"]
|
||||||
|
RESOURCE_INSERTED_AT = os.environ.get("RESOURCE_INSERTED_AT", "2025-04-14")
|
||||||
|
|||||||
@@ -166,3 +166,42 @@ def get_sort_value(sort_values: list) -> str:
|
|||||||
str: A formatted sort query string (e.g., "sort=created_at,-severity").
|
str: A formatted sort query string (e.g., "sort=created_at,-severity").
|
||||||
"""
|
"""
|
||||||
return f"sort={','.join(sort_values)}"
|
return f"sort={','.join(sort_values)}"
|
||||||
|
|
||||||
|
|
||||||
|
def get_available_resource_filters(host: str, token: str) -> dict:
|
||||||
|
"""
|
||||||
|
Fetches and returns available resource filter values from the API.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
host (str): The host URL of the API.
|
||||||
|
token (str): Bearer token for authentication.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: A dictionary containing lists of unique values for each resource filter type.
|
||||||
|
Example:
|
||||||
|
{
|
||||||
|
"service": ["ec2", "s3", "rds"],
|
||||||
|
"type": ["instance", "bucket"],
|
||||||
|
"region": ["us-east-1", "us-west-2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: If the API request fails or does not return a 200 status code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = f"{host}/resources"
|
||||||
|
params = {"fields[resources]": "type,region,service"}
|
||||||
|
|
||||||
|
response = requests.get(url, headers=get_auth_headers(token), params=params)
|
||||||
|
assert response.status_code == 200, f"Failed to fetch filters: {response.text}"
|
||||||
|
|
||||||
|
resources = response.json()["data"]
|
||||||
|
filters = {"service": set(), "type": set(), "region": set()}
|
||||||
|
|
||||||
|
for res in resources:
|
||||||
|
attr = res["attributes"]
|
||||||
|
filters["service"].add(attr["service"])
|
||||||
|
filters["type"].add(attr["type"])
|
||||||
|
filters["region"].add(attr["region"])
|
||||||
|
|
||||||
|
return {k: list(v) for k, v in filters.items()}
|
||||||
|
|||||||
Reference in New Issue
Block a user