66# See https://aboutcode.org for more information about AboutCode FOSS projects.
77#
88
9+ import logging
910from timeit import default_timer as timer
1011
1112from django .contrib .contenttypes .models import ContentType
1920from component_catalog .models import Package
2021from component_catalog .models import PackageAffectedByVulnerability
2122from dejacode_toolkit .vulnerablecode import VulnerableCode
23+ from dejacode_toolkit .vulnerablecode import get_plain_purls
2224from dje .models import DejacodeUser
2325from dje .utils import chunked_queryset
2426from dje .utils import humanize_time
2527from notification .models import find_and_fire_hook
2628from vulnerabilities .models import Vulnerability
2729
30+ logger = logging .getLogger ("dje" )
2831
29- def fetch_from_vulnerablecode (dataspace , batch_size , update , timeout , log_func = None , verbosity = 1 ):
32+
33+ def fetch_from_vulnerablecode (
34+ dataspace , batch_size , update , timeout , log_func = None , err_func = None , verbosity = 1
35+ ):
3036 """Fetch vulnerability data from VulnerableCode for all eligible packages in ``dataspace``."""
3137 start_time = timer ()
3238 vulnerablecode = VulnerableCode (dataspace )
@@ -57,6 +63,7 @@ def fetch_from_vulnerablecode(dataspace, batch_size, update, timeout, log_func=N
5763 update = update ,
5864 timeout = timeout ,
5965 log_func = log_func ,
66+ err_func = err_func ,
6067 verbosity = verbosity ,
6168 )
6269
@@ -73,7 +80,14 @@ def fetch_from_vulnerablecode(dataspace, batch_size, update, timeout, log_func=N
7380
7481
7582def fetch_for_packages (
76- queryset , dataspace , batch_size = 50 , update = True , timeout = None , log_func = None , verbosity = 1
83+ queryset ,
84+ dataspace ,
85+ batch_size = 50 ,
86+ update = True ,
87+ timeout = None ,
88+ log_func = None ,
89+ err_func = None ,
90+ verbosity = 1 ,
7791):
7892 from product_portfolio .models import ProductPackage
7993
@@ -100,6 +114,21 @@ def fetch_for_packages(
100114 vc_entries = vulnerablecode .get_vulnerable_purls (batch , details = True , timeout = timeout )
101115 api_elapsed = timer () - api_start
102116
117+ if vc_entries is None :
118+ failed_purls = get_plain_purls (batch )
119+ error_msg = (
120+ f"VulnerableCode API call failed for batch { index } "
121+ f"({ len (failed_purls )} purls, "
122+ f"progress: { intcomma (progress_count )} /{ intcomma (object_count )} ). "
123+ f"Purls: { ' ' .join (failed_purls )} "
124+ )
125+ logger .error (error_msg )
126+ if err_func :
127+ err_func (error_msg )
128+ elif log_func :
129+ log_func (f" API call failed for batch { index } - skipping." )
130+ continue
131+
103132 if log_func and verbosity >= 2 :
104133 log_func (
105134 f" API call: { humanize_time (api_elapsed )} ({ len (vc_entries )} vulnerable purls)"
0 commit comments