Skip to content

Commit a27f71f

Browse files
committed
optimizations
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent bd52c14 commit a27f71f

5 files changed

Lines changed: 49 additions & 31 deletions

File tree

policy/tasks.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ def evaluate_product_rules_task(product_uuid):
3333
logger.error(f"evaluate_product_rules_task: product {product_uuid} not found, skipping.")
3434
return
3535

36-
logger.info(f"Evaluating policy rules for product {product}")
36+
logger.info(f"Evaluating policy rules for product id={product.id}")
3737
new_violations, resolved_count = evaluate_rules(product)
3838
logger.info(
39-
f"Policy rules evaluated for {product}: "
39+
f"Policy rules evaluated for product id={product.id}: "
4040
f"{len(new_violations)} new violation(s), {resolved_count} resolved."
4141
)
4242

@@ -59,14 +59,16 @@ def evaluate_all_products_rules_task(include_locked=False, product_uuids=None):
5959
logger.info(f"Starting policy rule evaluation for {count} product(s).")
6060

6161
for product in products:
62-
logger.info(f"Evaluating policy rules for product {product}")
62+
logger.info(f"Evaluating policy rules for product id={product.id}")
6363
try:
6464
new_violations, resolved_count = evaluate_rules(product)
6565
except Exception:
66-
logger.exception(f"Policy rule evaluation failed for product {product}, skipping.")
66+
logger.exception(
67+
f"Policy rule evaluation failed for product id={product.id}, skipping."
68+
)
6769
continue
6870
logger.info(
69-
f"Policy rules evaluated for {product}: "
71+
f"Policy rules evaluated for product id={product.id}: "
7072
f"{len(new_violations)} new violation(s), {resolved_count} resolved."
7173
)
7274

product_portfolio/admin.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
from product_portfolio.importers import CodebaseResourceImporter
6060
from product_portfolio.importers import ProductComponentImporter
6161
from product_portfolio.importers import ProductPackageImporter
62+
from product_portfolio.importers import paused_product_package_reevaluation
63+
from product_portfolio.importers import reevaluate_products
6264
from product_portfolio.inlines import CodebaseResourceUsageDeployedFromInline
6365
from product_portfolio.inlines import CodebaseResourceUsageDeployedToInline
6466
from product_portfolio.inlines import ProductComponentInline
@@ -72,7 +74,6 @@
7274
from product_portfolio.models import ProductRelationStatus
7375
from product_portfolio.models import ProductStatus
7476
from reporting.filters import ReportingQueryListFilter
75-
from vulnerabilities.triage.engine import reevaluate_product_rulesets
7677
from vulnerabilities.triage.models import ProductTriageRuleset
7778

7879

@@ -242,13 +243,14 @@ def save_model(self, request, obj, form, change):
242243
if "_saveasnew" in request.POST:
243244
old_product_id = request.resolver_match.kwargs.get("object_id")
244245
old_product = self.get_object(request, old_product_id)
245-
for model_class in [ProductComponent, ProductPackage, ProductTriageRuleset]:
246-
for relationship in model_class.objects.filter(product=old_product):
247-
relationship.id = None
248-
relationship.uuid = uuid.uuid4()
249-
relationship.product = obj
250-
relationship.save()
251-
reevaluate_product_rulesets(obj)
246+
with paused_product_package_reevaluation():
247+
for model_class in [ProductComponent, ProductPackage, ProductTriageRuleset]:
248+
for relationship in model_class.objects.filter(product=old_product):
249+
relationship.id = None
250+
relationship.uuid = uuid.uuid4()
251+
relationship.product = obj
252+
relationship.save()
253+
reevaluate_products([obj])
252254

253255
def get_obj_perms_user_select_form(self, request):
254256
"""

vulnerabilities/triage/engine.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
88

9+
import logging
10+
911
from django.apps import apps
1012
from django.utils import timezone
1113

@@ -14,6 +16,8 @@
1416
from vulnerabilities.triage.rules import RULE_REGISTRY
1517
from vulnerabilities.triage.rules import rule_parameters_from_config
1618

19+
logger = logging.getLogger(__name__)
20+
1721

1822
def collect_matches(ruleset, product):
1923
"""
@@ -243,6 +247,27 @@ def evaluate_ruleset(ruleset, product, apply_preset=True):
243247
)
244248

245249

250+
def evaluate_assignments(assignments):
251+
"""
252+
Evaluate each ProductTriageRuleset assignment in the given queryset, skipping and
253+
logging any that raise instead of aborting the whole batch.
254+
255+
Returns the number of assignments successfully evaluated.
256+
"""
257+
evaluated_count = 0
258+
for assignment in assignments:
259+
try:
260+
evaluate_ruleset(ruleset=assignment.ruleset, product=assignment.product)
261+
except Exception:
262+
logger.exception(
263+
f"Triage evaluation failed for ruleset id={assignment.ruleset_id} /"
264+
f" product id={assignment.product_id}, skipping."
265+
)
266+
continue
267+
evaluated_count += 1
268+
return evaluated_count
269+
270+
246271
def reevaluate_product_rulesets(product, apply_preset=True):
247272
"""Re-evaluate all enabled triage rulesets currently assigned to the product."""
248273
assignments = ProductTriageRuleset.objects.filter(

vulnerabilities/triage/management/commands/evaluate_triage.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.core.management.base import CommandError
1111

1212
from dje.models import Dataspace
13-
from vulnerabilities.triage.engine import evaluate_ruleset
13+
from vulnerabilities.triage.engine import evaluate_assignments
1414
from vulnerabilities.triage.models import ProductTriageRuleset
1515
from vulnerabilities.triage.models import TriageRecord
1616

@@ -45,9 +45,8 @@ def handle(self, *args, **options):
4545
self.stdout.write("No active ruleset assignments found.")
4646
return
4747

48-
for assignment in assignments:
49-
self.stdout.write(f" {assignment.product} / {assignment.ruleset}")
50-
evaluate_ruleset(ruleset=assignment.ruleset, product=assignment.product)
48+
evaluated_count = evaluate_assignments(assignments)
49+
self.stdout.write(f"Evaluated: {evaluated_count}/{assignment_count}")
5150

5251
total = TriageRecord.objects.filter(dataspace=dataspace).count()
5352
self.stdout.write(

vulnerabilities/triage/tasks.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from django_rq import job
1414

1515
from dje.models import get_unsecured_manager
16-
from vulnerabilities.triage.engine import evaluate_ruleset
16+
from vulnerabilities.triage.engine import evaluate_assignments
1717
from vulnerabilities.triage.engine import reevaluate_product_rulesets
1818
from vulnerabilities.triage.models import ProductTriageRuleset
1919

@@ -34,7 +34,7 @@ def reevaluate_product_triage_rulesets_task(product_uuid):
3434
)
3535
return
3636

37-
logger.info(f"Evaluating triage rulesets for product {product}")
37+
logger.info(f"Evaluating triage rulesets for product id={product.id}")
3838
reevaluate_product_rulesets(product)
3939

4040

@@ -50,15 +50,5 @@ def evaluate_all_products_vulnerability_triage_task():
5050
count = assignments.count()
5151
logger.info(f"Starting triage evaluation for {count} ruleset assignment(s).")
5252

53-
for assignment in assignments:
54-
logger.info(f"Evaluating triage ruleset {assignment.ruleset} for {assignment.product}")
55-
try:
56-
evaluate_ruleset(ruleset=assignment.ruleset, product=assignment.product)
57-
except Exception:
58-
logger.exception(
59-
f"Triage evaluation failed for {assignment.ruleset} / {assignment.product},"
60-
" skipping."
61-
)
62-
continue
63-
64-
logger.info("Triage evaluation complete.")
53+
evaluated_count = evaluate_assignments(assignments)
54+
logger.info(f"Triage evaluation complete: {evaluated_count}/{count} evaluated.")

0 commit comments

Comments
 (0)