Skip to content

Commit c4aaa10

Browse files
committed
Get rid of added_advisory and batches
useless after a530627 Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent b6ef11d commit c4aaa10

5 files changed

Lines changed: 38 additions & 80 deletions

File tree

vulnerabilities/data_source.py

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ def normalized(self):
7878
class Advisory:
7979
"""
8080
This data class expresses the contract between data sources and the import runner.
81-
Data sources are expected to be usable as context managers and generators, yielding batches of
82-
Advisory sequences.
8381
8482
NB: There are two representations for package URLs that are commonly used by code consuming this
8583
data class; PackageURL objects and strings. As a convention, the former is referred to in
@@ -131,22 +129,18 @@ class DataSource(ContextManager):
131129

132130
def __init__(
133131
self,
134-
batch_size: int,
135132
last_run_date: Optional[datetime] = None,
136133
cutoff_date: Optional[datetime] = None,
137134
config: Optional[Mapping[str, Any]] = None,
138135
):
139136
"""
140137
Create a DataSource instance.
141138
142-
:param batch_size: Maximum number of records to return from added_advisories() and
143-
updated_advisories()
144139
:param last_run_date: Optional timestamp when this data source was last inspected
145140
:param cutoff_date: Optional timestamp, records older than this will be ignored
146141
:param config: Optional dictionary with subclass-specific configuration
147142
"""
148143
config = config or {}
149-
self.batch_size = batch_size
150144
try:
151145
self.config = self.__class__.CONFIG_CLASS(**config)
152146
# These really should be declared in DataSourceConfiguration above but that would
@@ -194,16 +188,9 @@ def validate_configuration(self) -> None:
194188
"""
195189
pass
196190

197-
def added_advisories(self) -> Set[Advisory]:
198-
"""
199-
Subclasses yield batch_size sized batches of Advisory objects that have been added to the
200-
data source since the last run or self.cutoff_date.
201-
"""
202-
return set()
203-
204191
def updated_advisories(self) -> Set[Advisory]:
205192
"""
206-
Subclasses yield batch_size sized batches of Advisory objects that have been modified since
193+
Subclasses return Advisory objects that have been modified since
207194
the last run or self.cutoff_date.
208195
209196
NOTE: Data sources that do not enable detection of changes to existing records vs added
@@ -218,21 +205,6 @@ def error(self, msg: str) -> None:
218205
"""
219206
raise InvalidConfigurationError(f"{type(self).__name__}: {msg}")
220207

221-
def batch_advisories(self, advisories: List[Advisory]) -> Set[Advisory]:
222-
"""
223-
Yield batches of the passed in list of advisories.
224-
"""
225-
226-
# TODO make this less cryptic and efficient
227-
228-
advisories = advisories[:]
229-
# copy the list as we are mutating it in the loop below
230-
231-
while advisories:
232-
b, advisories = advisories[: self.batch_size], advisories[self.batch_size :]
233-
yield b
234-
235-
236208
@dataclasses.dataclass
237209
class GitDataSourceConfiguration(DataSourceConfiguration):
238210
repository_url: str

vulnerabilities/import_runner.py

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import logging
2727
from itertools import chain
2828
from typing import Tuple
29+
from typing import Set
2930

3031
from django.db import transaction
3132

@@ -68,9 +69,8 @@ class ImportRunner:
6869
- All update and select operations must use indexed columns.
6970
"""
7071

71-
def __init__(self, importer: models.Importer, batch_size: int):
72+
def __init__(self, importer: models.Importer):
7273
self.importer = importer
73-
self.batch_size = batch_size
7474

7575
def run(self, cutoff_date: datetime.datetime = None) -> None:
7676
"""
@@ -84,9 +84,10 @@ def run(self, cutoff_date: datetime.datetime = None) -> None:
8484
from all Linux distributions that package this kernel version.
8585
"""
8686
logger.info(f"Starting import for {self.importer.name}.")
87-
data_source = self.importer.make_data_source(self.batch_size, cutoff_date=cutoff_date)
87+
data_source = self.importer.make_data_source(cutoff_date=cutoff_date)
8888
with data_source:
89-
process_advisories(data_source)
89+
advisories = data_source.updated_advisories()
90+
process_advisories(advisories)
9091
self.importer.last_run = datetime.datetime.now(tz=datetime.timezone.utc)
9192
self.importer.data_source_cfg = dataclasses.asdict(data_source.config)
9293
self.importer.save()
@@ -108,46 +109,41 @@ def get_vuln_pkg_refs(vulnerability, package):
108109

109110

110111
@transaction.atomic
111-
def process_advisories(data_source: DataSource) -> None:
112+
def process_advisories(advisories: Set[Advisory]) -> None:
112113
bulk_create_vuln_pkg_refs = set()
113-
# Treat updated_advisories and added_advisories as same. Eventually
114-
# we want to refactor all data sources to provide advisories via a
115-
# single method.
116-
advisory_batches = chain(data_source.updated_advisories(), data_source.added_advisories())
117-
for batch in advisory_batches:
118-
for advisory in batch:
119-
vuln, vuln_created = _get_or_create_vulnerability(advisory)
120-
for vuln_ref in advisory.references:
121-
ref, _ = models.VulnerabilityReference.objects.get_or_create(
122-
vulnerability=vuln, reference_id=vuln_ref.reference_id, url=vuln_ref.url
114+
for advisory in advisories:
115+
vuln, vuln_created = _get_or_create_vulnerability(advisory)
116+
for vuln_ref in advisory.references:
117+
ref, _ = models.VulnerabilityReference.objects.get_or_create(
118+
vulnerability=vuln, reference_id=vuln_ref.reference_id, url=vuln_ref.url
119+
)
120+
121+
for score in vuln_ref.severities:
122+
models.VulnerabilitySeverity.objects.update_or_create(
123+
vulnerability=vuln,
124+
scoring_system=score.system.identifier,
125+
reference=ref,
126+
defaults={"value": str(score.value)},
123127
)
124128

125-
for score in vuln_ref.severities:
126-
models.VulnerabilitySeverity.objects.update_or_create(
127-
vulnerability=vuln,
128-
scoring_system=score.system.identifier,
129-
reference=ref,
130-
defaults={"value": str(score.value)},
131-
)
132-
133-
for aff_pkg_with_patched_pkg in advisory.affected_packages:
134-
vulnerable_package, _ = _get_or_create_package(
135-
aff_pkg_with_patched_pkg.vulnerable_package
129+
for aff_pkg_with_patched_pkg in advisory.affected_packages:
130+
vulnerable_package, _ = _get_or_create_package(
131+
aff_pkg_with_patched_pkg.vulnerable_package
132+
)
133+
patched_package = None
134+
if aff_pkg_with_patched_pkg.patched_package:
135+
patched_package, _ = _get_or_create_package(
136+
aff_pkg_with_patched_pkg.patched_package
136137
)
137-
patched_package = None
138-
if aff_pkg_with_patched_pkg.patched_package:
139-
patched_package, _ = _get_or_create_package(
140-
aff_pkg_with_patched_pkg.patched_package
141-
)
142138

143-
prv, _ = models.PackageRelatedVulnerability.objects.get_or_create(
144-
vulnerability=vuln,
145-
package=vulnerable_package,
146-
)
139+
prv, _ = models.PackageRelatedVulnerability.objects.get_or_create(
140+
vulnerability=vuln,
141+
package=vulnerable_package,
142+
)
147143

148-
if patched_package:
149-
prv.patched_package = patched_package
150-
prv.save()
144+
if patched_package:
145+
prv.patched_package = patched_package
146+
prv.save()
151147

152148
models.PackageRelatedVulnerability.objects.bulk_create(
153149
[i.to_model_object() for i in bulk_create_vuln_pkg_refs]

vulnerabilities/importers/nginx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def updated_advisories(self):
6868
self.set_api()
6969
data = requests.get(self.url).content
7070
advisories.extend(self.to_advisories(data))
71-
return self.batch_advisories(advisories)
71+
return advisories
7272

7373
def to_advisories(self, data):
7474
advisories = []

vulnerabilities/management/commands/import.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,13 @@ def add_arguments(self, parser):
5353
)
5454
parser.add_argument("sources", nargs="*", help="Data sources from which to import")
5555

56-
parser.add_argument(
57-
"--batch_size", help="The batch size to be used for bulk inserting data"
58-
)
59-
6056
def handle(self, *args, **options):
6157
# load_importers() seeds the DB with Importers
6258
load_importers()
6359
if options["list"]:
6460
self.list_sources()
6561
return
6662

67-
if options["batch_size"]:
68-
self.batch_size = options["batch_size"]
69-
7063
if options["all"]:
7164
self._import_data(Importer.objects.all(), options["cutoff_date"])
7265
return
@@ -105,9 +98,8 @@ def _import_data(self, importers, cutoff_date):
10598

10699
for importer in importers:
107100
self.stdout.write(f"Importing data from {importer.name}")
108-
batch_size = int(getattr(self, "batch_size", 10))
109101
try:
110-
ImportRunner(importer, batch_size).run(cutoff_date=cutoff_date)
102+
ImportRunner(importer).run(cutoff_date=cutoff_date)
111103
self.stdout.write(
112104
self.style.SUCCESS(f"Successfully imported data from {importer.name}")
113105
)

vulnerabilities/models.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,18 +235,16 @@ class Importer(models.Model):
235235
help_text="Implementation-specific configuration for the data source",
236236
)
237237

238-
def make_data_source(self, batch_size: int, cutoff_date: datetime = None) -> DataSource:
238+
def make_data_source(self, cutoff_date: datetime = None) -> DataSource:
239239
"""
240240
Return a configured and ready to use instance of this importers data source implementation.
241241
242-
batch_size - max. number of records to return on each iteration
243242
cutoff_date - optional timestamp of the oldest data to include in the import
244243
"""
245244
importers_module = importlib.import_module("vulnerabilities.importers")
246245
klass = getattr(importers_module, self.data_source)
247246

248247
ds = klass(
249-
batch_size,
250248
last_run_date=self.last_run,
251249
cutoff_date=cutoff_date,
252250
config=self.data_source_cfg,

0 commit comments

Comments
 (0)