Skip to content

Commit cfaef03

Browse files
committed
Move errata record creation to dramatiq task
1 parent b418041 commit cfaef03

File tree

6 files changed

+214
-179
lines changed

6 files changed

+214
-179
lines changed

alws/crud/errata.py

Lines changed: 167 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -912,8 +912,9 @@ async def process_new_errata_packages(
912912
return packages, pkg_types
913913

914914

915-
async def create_new_errata_record(errata: BaseErrataRecord):
915+
async def create_new_errata_record(errata):
916916
async with open_async_session(key=get_async_db_key()) as session:
917+
errata = BaseErrataRecord(**errata)
917918
platform = await session.execute(
918919
select(models.Platform)
919920
.where(models.Platform.id == errata.platform_id)
@@ -1009,179 +1010,181 @@ async def create_new_errata_record(errata: BaseErrataRecord):
10091010
return db_errata
10101011

10111012

1012-
async def create_errata_record(db: AsyncSession, errata: BaseErrataRecord):
1013-
platform = await db.execute(
1014-
select(models.Platform)
1015-
.where(models.Platform.id == errata.platform_id)
1016-
.options(selectinload(models.Platform.repos))
1017-
)
1018-
platform = platform.scalars().first()
1019-
items_to_insert = []
1020-
original_id = errata.id
1021-
1022-
# Rebranding RHEL -> AlmaLinux
1023-
for key in ("description", "title"):
1024-
setattr(
1025-
errata,
1026-
key,
1027-
debrand_description_and_title(getattr(errata, key)),
1013+
async def create_errata_record(errata):
1014+
async with open_async_session(key=get_async_db_key()) as session:
1015+
errata = BaseErrataRecord(**errata)
1016+
platform = await session.execute(
1017+
select(models.Platform)
1018+
.where(models.Platform.id == errata.platform_id)
1019+
.options(selectinload(models.Platform.repos))
10281020
)
1029-
alma_errata_id = re.sub(r"^RH", "AL", errata.id)
1030-
1031-
# Check if errata refers to a module
1032-
r = re.compile(r"Module ([\d\w\-\_]+:[\d\.\w]+) is enabled")
1033-
match = r.findall(str(errata.criteria))
1034-
# Ensure we get a module and is not the -devel one
1035-
errata_module = None if not match else match[0].replace("-devel:", ":")
1036-
1037-
# Errata db record
1038-
db_errata = models.NewErrataRecord(
1039-
id=alma_errata_id,
1040-
freezed=errata.freezed,
1041-
platform_id=errata.platform_id,
1042-
module=errata_module,
1043-
release_status=ErrataReleaseStatus.NOT_RELEASED,
1044-
summary=None,
1045-
solution=None,
1046-
issued_date=errata.issued_date,
1047-
updated_date=errata.updated_date,
1048-
description=None,
1049-
original_description=errata.description,
1050-
title=None,
1051-
oval_title=get_oval_title(
1052-
errata.title, alma_errata_id, errata.severity
1053-
),
1054-
original_title=get_verbose_errata_title(errata.title, errata.severity),
1055-
contact_mail=platform.contact_mail,
1056-
status=errata.status,
1057-
version=errata.version,
1058-
severity=errata.severity,
1059-
rights=jinja2.Template(platform.copyright).render(
1060-
year=datetime.datetime.utcnow().year
1061-
),
1062-
definition_id=errata.definition_id,
1063-
definition_version=errata.definition_version,
1064-
definition_class=errata.definition_class,
1065-
affected_cpe=errata.affected_cpe,
1066-
criteria=None,
1067-
original_criteria=errata.criteria,
1068-
tests=None,
1069-
original_tests=errata.tests,
1070-
objects=None,
1071-
original_objects=errata.objects,
1072-
states=None,
1073-
original_states=errata.states,
1074-
variables=None,
1075-
original_variables=errata.variables,
1076-
)
1077-
items_to_insert.append(db_errata)
1021+
platform = platform.scalars().first()
1022+
items_to_insert = []
1023+
original_id = errata.id
10781024

1079-
# References
1080-
self_ref_exists = False
1081-
for ref in errata.references:
1082-
db_cve = None
1083-
if ref.cve:
1084-
db_cve = await db.execute(
1085-
select(models.ErrataCVE).where(
1086-
models.ErrataCVE.id == ref.cve.id
1087-
)
1025+
# Rebranding RHEL -> AlmaLinux
1026+
for key in ("description", "title"):
1027+
setattr(
1028+
errata,
1029+
key,
1030+
debrand_description_and_title(getattr(errata, key)),
10881031
)
1089-
db_cve = db_cve.scalars().first()
1090-
if db_cve is None:
1091-
db_cve = models.ErrataCVE(
1092-
id=ref.cve.id,
1093-
cvss3=ref.cve.cvss3,
1094-
cwe=ref.cve.cwe,
1095-
impact=ref.cve.impact,
1096-
public=ref.cve.public,
1097-
)
1098-
items_to_insert.append(db_cve)
1099-
ref_title = ""
1100-
if ref.ref_type in (
1101-
ErrataReferenceType.cve.value,
1102-
ErrataReferenceType.rhsa.value,
1103-
):
1104-
ref_title = ref.ref_id
1105-
db_reference = models.NewErrataReference(
1106-
href=ref.href,
1107-
ref_id=ref.ref_id,
1108-
ref_type=ref.ref_type,
1109-
title=ref_title,
1110-
cve=db_cve,
1111-
)
1112-
if ref.ref_type == ErrataReferenceType.self_ref.value:
1113-
self_ref_exists = True
1114-
db_errata.references.append(db_reference)
1115-
items_to_insert.append(db_reference)
1116-
if not self_ref_exists:
1117-
html_id = db_errata.id.replace(":", "-")
1118-
self_ref = models.NewErrataReference(
1119-
href=(
1120-
"https://errata.almalinux.org/"
1121-
f"{platform.distr_version}/{html_id}.html"
1032+
alma_errata_id = re.sub(r"^RH", "AL", errata.id)
1033+
1034+
# Check if errata refers to a module
1035+
r = re.compile(r"Module ([\d\w\-\_]+:[\d\.\w]+) is enabled")
1036+
match = r.findall(str(errata.criteria))
1037+
# Ensure we get a module and is not the -devel one
1038+
errata_module = None if not match else match[0].replace("-devel:", ":")
1039+
1040+
# Errata db record
1041+
db_errata = models.NewErrataRecord(
1042+
id=alma_errata_id,
1043+
freezed=errata.freezed,
1044+
platform_id=errata.platform_id,
1045+
module=errata_module,
1046+
release_status=ErrataReleaseStatus.NOT_RELEASED,
1047+
summary=None,
1048+
solution=None,
1049+
issued_date=errata.issued_date,
1050+
updated_date=errata.updated_date,
1051+
description=None,
1052+
original_description=errata.description,
1053+
title=None,
1054+
oval_title=get_oval_title(
1055+
errata.title, alma_errata_id, errata.severity
11221056
),
1123-
ref_id=db_errata.id,
1124-
ref_type=ErrataReferenceType.self_ref,
1125-
title=db_errata.id,
1057+
original_title=get_verbose_errata_title(errata.title, errata.severity),
1058+
contact_mail=platform.contact_mail,
1059+
status=errata.status,
1060+
version=errata.version,
1061+
severity=errata.severity,
1062+
rights=jinja2.Template(platform.copyright).render(
1063+
year=datetime.datetime.utcnow().year
1064+
),
1065+
definition_id=errata.definition_id,
1066+
definition_version=errata.definition_version,
1067+
definition_class=errata.definition_class,
1068+
affected_cpe=errata.affected_cpe,
1069+
criteria=None,
1070+
original_criteria=errata.criteria,
1071+
tests=None,
1072+
original_tests=errata.tests,
1073+
objects=None,
1074+
original_objects=errata.objects,
1075+
states=None,
1076+
original_states=errata.states,
1077+
variables=None,
1078+
original_variables=errata.variables,
11261079
)
1127-
db_errata.references.append(self_ref)
1128-
items_to_insert.append(self_ref)
1080+
items_to_insert.append(db_errata)
11291081

1130-
# Errata Packages
1131-
search_params = prepare_search_params(errata)
1082+
# References
1083+
self_ref_exists = False
1084+
for ref in errata.references:
1085+
db_cve = None
1086+
if ref.cve:
1087+
db_cve = await session.execute(
1088+
select(models.ErrataCVE).where(
1089+
models.ErrataCVE.id == ref.cve.id
1090+
)
1091+
)
1092+
db_cve = db_cve.scalars().first()
1093+
if db_cve is None:
1094+
db_cve = models.ErrataCVE(
1095+
id=ref.cve.id,
1096+
cvss3=ref.cve.cvss3,
1097+
cwe=ref.cve.cwe,
1098+
impact=ref.cve.impact,
1099+
public=ref.cve.public,
1100+
)
1101+
items_to_insert.append(db_cve)
1102+
ref_title = ""
1103+
if ref.ref_type in (
1104+
ErrataReferenceType.cve.value,
1105+
ErrataReferenceType.rhsa.value,
1106+
):
1107+
ref_title = ref.ref_id
1108+
db_reference = models.NewErrataReference(
1109+
href=ref.href,
1110+
ref_id=ref.ref_id,
1111+
ref_type=ref.ref_type,
1112+
title=ref_title,
1113+
cve=db_cve,
1114+
)
1115+
if ref.ref_type == ErrataReferenceType.self_ref.value:
1116+
self_ref_exists = True
1117+
db_errata.references.append(db_reference)
1118+
items_to_insert.append(db_reference)
1119+
if not self_ref_exists:
1120+
html_id = db_errata.id.replace(":", "-")
1121+
self_ref = models.NewErrataReference(
1122+
href=(
1123+
"https://errata.almalinux.org/"
1124+
f"{platform.distr_version}/{html_id}.html"
1125+
),
1126+
ref_id=db_errata.id,
1127+
ref_type=ErrataReferenceType.self_ref,
1128+
title=db_errata.id,
1129+
)
1130+
db_errata.references.append(self_ref)
1131+
items_to_insert.append(self_ref)
11321132

1133-
prod_repos_cache = await load_platform_packages(
1134-
platform,
1135-
search_params,
1136-
False,
1137-
db_errata.module,
1138-
)
1139-
pkg_types = []
1140-
for package in errata.packages:
1141-
db_package = models.NewErrataPackage(
1142-
name=package.name,
1143-
version=package.version,
1144-
release=package.release,
1145-
epoch=package.epoch,
1146-
arch=package.arch,
1147-
source_srpm=None,
1148-
reboot_suggested=False,
1149-
)
1150-
db_errata.packages.append(db_package)
1151-
items_to_insert.append(db_package)
1152-
# Create ErrataToAlbsPackages
1153-
matching_packages, pkg_type = await get_matching_albs_packages(
1154-
db, db_package, prod_repos_cache, db_errata.module
1133+
# Errata Packages
1134+
search_params = prepare_search_params(errata)
1135+
1136+
prod_repos_cache = await load_platform_packages(
1137+
platform,
1138+
search_params,
1139+
False,
1140+
db_errata.module,
11551141
)
1156-
pkg_types.append(pkg_type)
1157-
items_to_insert.extend(matching_packages)
1142+
pkg_types = []
1143+
for package in errata.packages:
1144+
db_package = models.NewErrataPackage(
1145+
name=package.name,
1146+
version=package.version,
1147+
release=package.release,
1148+
epoch=package.epoch,
1149+
arch=package.arch,
1150+
source_srpm=None,
1151+
reboot_suggested=False,
1152+
)
1153+
db_errata.packages.append(db_package)
1154+
items_to_insert.append(db_package)
1155+
# Create ErrataToAlbsPackages
1156+
matching_packages, pkg_type = await get_matching_albs_packages(
1157+
session, db_package, prod_repos_cache, db_errata.module
1158+
)
1159+
pkg_types.append(pkg_type)
1160+
items_to_insert.extend(matching_packages)
11581161

1159-
db.add_all(items_to_insert)
1160-
await db.flush()
1161-
await db.refresh(db_errata)
1162-
if not settings.github_integration_enabled:
1163-
return db_errata
1162+
session.add_all(items_to_insert)
1163+
await session.flush()
1164+
await session.refresh(db_errata)
1165+
if not settings.github_integration_enabled:
1166+
return db_errata
11641167

1165-
try:
1166-
github_client = await get_github_client()
1167-
await create_github_issue(
1168-
client=github_client,
1169-
title=errata.title,
1170-
description=errata.description,
1171-
advisory_id=alma_errata_id,
1172-
original_id=original_id,
1173-
platform_name=platform.name,
1174-
severity=errata.severity,
1175-
packages=errata.packages,
1176-
platform_id=errata.platform_id,
1177-
find_packages_types=pkg_types,
1178-
)
1179-
except Exception as err:
1180-
logging.exception(
1181-
"Cannot create GitHub issue: %s",
1182-
err,
1183-
)
1184-
return db_errata
1168+
try:
1169+
github_client = await get_github_client()
1170+
await create_github_issue(
1171+
client=github_client,
1172+
title=errata.title,
1173+
description=errata.description,
1174+
advisory_id=alma_errata_id,
1175+
original_id=original_id,
1176+
platform_name=platform.name,
1177+
severity=errata.severity,
1178+
packages=errata.packages,
1179+
platform_id=errata.platform_id,
1180+
find_packages_types=pkg_types,
1181+
)
1182+
except Exception as err:
1183+
logging.exception(
1184+
"Cannot create GitHub issue: %s",
1185+
err,
1186+
)
1187+
return db_errata
11851188

11861189

11871190
async def get_errata_record(

alws/dramatiq/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
bulk_errata_release,
3636
bulk_new_errata_release,
3737
create_new_errata,
38+
create_errata,
3839
release_errata,
3940
release_new_errata,
4041
reset_records_threshold,

0 commit comments

Comments
 (0)