|
4 | 4 | import json |
5 | 5 | import logging |
6 | 6 | import re |
| 7 | +import typing |
7 | 8 | import uuid |
8 | 9 | from typing import ( |
9 | 10 | Any, |
|
33 | 34 | ErrataReferenceType, |
34 | 35 | ErrataReleaseStatus, |
35 | 36 | ) |
36 | | -from alws.dependencies import get_async_db_key |
| 37 | +from alws.dependencies import get_async_db_key, get_async_db_session |
37 | 38 | from alws.pulp_models import ( |
38 | 39 | RpmPackage, |
39 | 40 | UpdateCollection, |
@@ -912,8 +913,9 @@ async def process_new_errata_packages( |
912 | 913 | return packages, pkg_types |
913 | 914 |
|
914 | 915 |
|
915 | | -async def create_new_errata_record(errata: BaseErrataRecord): |
916 | | - async with open_async_session(key=get_async_db_key()) as session: |
| 916 | +async def create_new_errata_record(errata: typing.Dict): |
| 917 | + async with get_async_db_session() as session: |
| 918 | + errata = BaseErrataRecord(**errata) |
917 | 919 | platform = await session.execute( |
918 | 920 | select(models.Platform) |
919 | 921 | .where(models.Platform.id == errata.platform_id) |
@@ -1009,179 +1011,181 @@ async def create_new_errata_record(errata: BaseErrataRecord): |
1009 | 1011 | return db_errata |
1010 | 1012 |
|
1011 | 1013 |
|
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)), |
| 1014 | +async def create_errata_record(errata: typing.Dict): |
| 1015 | + async with get_async_db_session() as session: |
| 1016 | + errata = BaseErrataRecord(**errata) |
| 1017 | + platform = await session.execute( |
| 1018 | + select(models.Platform) |
| 1019 | + .where(models.Platform.id == errata.platform_id) |
| 1020 | + .options(selectinload(models.Platform.repos)) |
1028 | 1021 | ) |
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) |
| 1022 | + platform = platform.scalars().first() |
| 1023 | + items_to_insert = [] |
| 1024 | + original_id = errata.id |
1078 | 1025 |
|
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 | | - ) |
| 1026 | + # Rebranding RHEL -> AlmaLinux |
| 1027 | + for key in ("description", "title"): |
| 1028 | + setattr( |
| 1029 | + errata, |
| 1030 | + key, |
| 1031 | + debrand_description_and_title(getattr(errata, key)), |
1088 | 1032 | ) |
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" |
| 1033 | + alma_errata_id = re.sub(r"^RH", "AL", errata.id) |
| 1034 | + |
| 1035 | + # Check if errata refers to a module |
| 1036 | + r = re.compile(r"Module ([\d\w\-\_]+:[\d\.\w]+) is enabled") |
| 1037 | + match = r.findall(str(errata.criteria)) |
| 1038 | + # Ensure we get a module and is not the -devel one |
| 1039 | + errata_module = None if not match else match[0].replace("-devel:", ":") |
| 1040 | + |
| 1041 | + # Errata db record |
| 1042 | + db_errata = models.NewErrataRecord( |
| 1043 | + id=alma_errata_id, |
| 1044 | + freezed=errata.freezed, |
| 1045 | + platform_id=errata.platform_id, |
| 1046 | + module=errata_module, |
| 1047 | + release_status=ErrataReleaseStatus.NOT_RELEASED, |
| 1048 | + summary=None, |
| 1049 | + solution=None, |
| 1050 | + issued_date=errata.issued_date, |
| 1051 | + updated_date=errata.updated_date, |
| 1052 | + description=None, |
| 1053 | + original_description=errata.description, |
| 1054 | + title=None, |
| 1055 | + oval_title=get_oval_title( |
| 1056 | + errata.title, alma_errata_id, errata.severity |
1122 | 1057 | ), |
1123 | | - ref_id=db_errata.id, |
1124 | | - ref_type=ErrataReferenceType.self_ref, |
1125 | | - title=db_errata.id, |
| 1058 | + original_title=get_verbose_errata_title(errata.title, errata.severity), |
| 1059 | + contact_mail=platform.contact_mail, |
| 1060 | + status=errata.status, |
| 1061 | + version=errata.version, |
| 1062 | + severity=errata.severity, |
| 1063 | + rights=jinja2.Template(platform.copyright).render( |
| 1064 | + year=datetime.datetime.utcnow().year |
| 1065 | + ), |
| 1066 | + definition_id=errata.definition_id, |
| 1067 | + definition_version=errata.definition_version, |
| 1068 | + definition_class=errata.definition_class, |
| 1069 | + affected_cpe=errata.affected_cpe, |
| 1070 | + criteria=None, |
| 1071 | + original_criteria=errata.criteria, |
| 1072 | + tests=None, |
| 1073 | + original_tests=errata.tests, |
| 1074 | + objects=None, |
| 1075 | + original_objects=errata.objects, |
| 1076 | + states=None, |
| 1077 | + original_states=errata.states, |
| 1078 | + variables=None, |
| 1079 | + original_variables=errata.variables, |
1126 | 1080 | ) |
1127 | | - db_errata.references.append(self_ref) |
1128 | | - items_to_insert.append(self_ref) |
| 1081 | + items_to_insert.append(db_errata) |
1129 | 1082 |
|
1130 | | - # Errata Packages |
1131 | | - search_params = prepare_search_params(errata) |
| 1083 | + # References |
| 1084 | + self_ref_exists = False |
| 1085 | + for ref in errata.references: |
| 1086 | + db_cve = None |
| 1087 | + if ref.cve: |
| 1088 | + db_cve = await session.execute( |
| 1089 | + select(models.ErrataCVE).where( |
| 1090 | + models.ErrataCVE.id == ref.cve.id |
| 1091 | + ) |
| 1092 | + ) |
| 1093 | + db_cve = db_cve.scalars().first() |
| 1094 | + if db_cve is None: |
| 1095 | + db_cve = models.ErrataCVE( |
| 1096 | + id=ref.cve.id, |
| 1097 | + cvss3=ref.cve.cvss3, |
| 1098 | + cwe=ref.cve.cwe, |
| 1099 | + impact=ref.cve.impact, |
| 1100 | + public=ref.cve.public, |
| 1101 | + ) |
| 1102 | + items_to_insert.append(db_cve) |
| 1103 | + ref_title = "" |
| 1104 | + if ref.ref_type in ( |
| 1105 | + ErrataReferenceType.cve.value, |
| 1106 | + ErrataReferenceType.rhsa.value, |
| 1107 | + ): |
| 1108 | + ref_title = ref.ref_id |
| 1109 | + db_reference = models.NewErrataReference( |
| 1110 | + href=ref.href, |
| 1111 | + ref_id=ref.ref_id, |
| 1112 | + ref_type=ref.ref_type, |
| 1113 | + title=ref_title, |
| 1114 | + cve=db_cve, |
| 1115 | + ) |
| 1116 | + if ref.ref_type == ErrataReferenceType.self_ref.value: |
| 1117 | + self_ref_exists = True |
| 1118 | + db_errata.references.append(db_reference) |
| 1119 | + items_to_insert.append(db_reference) |
| 1120 | + if not self_ref_exists: |
| 1121 | + html_id = db_errata.id.replace(":", "-") |
| 1122 | + self_ref = models.NewErrataReference( |
| 1123 | + href=( |
| 1124 | + "https://errata.almalinux.org/" |
| 1125 | + f"{platform.distr_version}/{html_id}.html" |
| 1126 | + ), |
| 1127 | + ref_id=db_errata.id, |
| 1128 | + ref_type=ErrataReferenceType.self_ref, |
| 1129 | + title=db_errata.id, |
| 1130 | + ) |
| 1131 | + db_errata.references.append(self_ref) |
| 1132 | + items_to_insert.append(self_ref) |
1132 | 1133 |
|
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 |
| 1134 | + # Errata Packages |
| 1135 | + search_params = prepare_search_params(errata) |
| 1136 | + |
| 1137 | + prod_repos_cache = await load_platform_packages( |
| 1138 | + platform, |
| 1139 | + search_params, |
| 1140 | + False, |
| 1141 | + db_errata.module, |
1155 | 1142 | ) |
1156 | | - pkg_types.append(pkg_type) |
1157 | | - items_to_insert.extend(matching_packages) |
| 1143 | + pkg_types = [] |
| 1144 | + for package in errata.packages: |
| 1145 | + db_package = models.NewErrataPackage( |
| 1146 | + name=package.name, |
| 1147 | + version=package.version, |
| 1148 | + release=package.release, |
| 1149 | + epoch=package.epoch, |
| 1150 | + arch=package.arch, |
| 1151 | + source_srpm=None, |
| 1152 | + reboot_suggested=False, |
| 1153 | + ) |
| 1154 | + db_errata.packages.append(db_package) |
| 1155 | + items_to_insert.append(db_package) |
| 1156 | + # Create ErrataToAlbsPackages |
| 1157 | + matching_packages, pkg_type = await get_matching_albs_packages( |
| 1158 | + session, db_package, prod_repos_cache, db_errata.module |
| 1159 | + ) |
| 1160 | + pkg_types.append(pkg_type) |
| 1161 | + items_to_insert.extend(matching_packages) |
1158 | 1162 |
|
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 |
| 1163 | + session.add_all(items_to_insert) |
| 1164 | + await session.flush() |
| 1165 | + await session.refresh(db_errata) |
| 1166 | + if not settings.github_integration_enabled: |
| 1167 | + return db_errata |
1164 | 1168 |
|
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 |
| 1169 | + try: |
| 1170 | + github_client = await get_github_client() |
| 1171 | + await create_github_issue( |
| 1172 | + client=github_client, |
| 1173 | + title=errata.title, |
| 1174 | + description=errata.description, |
| 1175 | + advisory_id=alma_errata_id, |
| 1176 | + original_id=original_id, |
| 1177 | + platform_name=platform.name, |
| 1178 | + severity=errata.severity, |
| 1179 | + packages=errata.packages, |
| 1180 | + platform_id=errata.platform_id, |
| 1181 | + find_packages_types=pkg_types, |
| 1182 | + ) |
| 1183 | + except Exception as err: |
| 1184 | + logging.exception( |
| 1185 | + "Cannot create GitHub issue: %s", |
| 1186 | + err, |
| 1187 | + ) |
| 1188 | + return db_errata |
1185 | 1189 |
|
1186 | 1190 |
|
1187 | 1191 | async def get_errata_record( |
|
0 commit comments