def compose__import_rpms(request, release_id, composeinfo, rpm_manifest): release_obj = release_models.Release.objects.get(release_id=release_id) ci = common_hacks.composeinfo_from_str(composeinfo) rm = common_hacks.rpms_from_str(rpm_manifest) compose_date = "%s-%s-%s" % (ci.compose.date[:4], ci.compose.date[4:6], ci.compose.date[6:]) compose_type = models.ComposeType.objects.get(name=ci.compose.type) acceptance_status = models.ComposeAcceptanceTestingState.objects.get(name='untested') compose_obj, _ = models.Compose.objects.get_or_create( release=release_obj, compose_id=ci.compose.id, compose_date=compose_date, compose_type=compose_type, compose_respin=ci.compose.respin, compose_label=ci.compose.label or None, acceptance_testing=acceptance_status, ) rpms_in_db = {} qs = package_models.RPM.objects.all() for rpm in qs.iterator(): key = "%s-%s:%s-%s.%s" % (rpm.name, rpm.epoch, rpm.version, rpm.release, rpm.arch) rpms_in_db[key] = rpm.id cursor = connection.cursor() for variant in ci.get_variants(recursive=True): _link_compose_to_integrated_product(compose_obj, variant) variant_type = release_models.VariantType.objects.get(name=variant.type) variant_obj, _ = models.Variant.objects.get_or_create(compose=compose_obj, variant_id=variant.id, variant_uid=variant.uid, variant_name=variant.name, variant_type=variant_type) for arch in variant.arches: arch_obj = common_models.Arch.objects.get(name=arch) var_arch_obj, _ = models.VariantArch.objects.get_or_create(arch=arch_obj, variant=variant_obj) compose_rpms_in_db = set() qs = models.ComposeRPM.objects.filter(variant_arch=var_arch_obj).values_list('variant_arch_id', 'rpm_id') for (variant_arch_id, rpm_id) in qs.iterator(): key = "%s/%s" % (variant_arch_id, rpm_id) compose_rpms_in_db.add(key) sources = set() for srpm_nevra, rpms in rm.rpms.get(variant.uid, {}).get(arch, {}).iteritems(): sources.add(srpm_nevra) for rpm_nevra, rpm_data in rpms.iteritems(): path, filename = os.path.split(rpm_data['path']) rpm_id = get_or_insert_rpm(rpms_in_db, cursor, rpm_nevra, srpm_nevra, filename) sigkey_id = common_models.SigKey.get_cached_id(rpm_data["sigkey"], create=True) path_id = models.Path.get_cached_id(path, create=True) content_category = rpm_data["category"] content_category_id = repository_models.ContentCategory.get_cached_id(content_category) insert_compose_rpms_if_nonexist(compose_rpms_in_db, cursor, var_arch_obj.id, rpm_id, content_category_id, sigkey_id, path_id)
def compose__import_rpms(request, release_id, composeinfo, rpm_manifest): release_obj = release_models.Release.objects.get(release_id=release_id) ci = common_hacks.composeinfo_from_str(composeinfo) rm = common_hacks.rpms_from_str(rpm_manifest) _maybe_raise_inconsistency_error(ci, rm, 'rpms') compose_date = "%s-%s-%s" % (ci.compose.date[:4], ci.compose.date[4:6], ci.compose.date[6:]) compose_type = models.ComposeType.objects.get(name=ci.compose.type) acceptance_status = models.ComposeAcceptanceTestingState.objects.get(name='untested') compose_obj, created = lib._logged_get_or_create( request, models.Compose, release=release_obj, compose_id=ci.compose.id, compose_date=compose_date, compose_type=compose_type, compose_respin=ci.compose.respin, compose_label=ci.compose.label or None, acceptance_testing=acceptance_status, ) if created and hasattr(request._request, '_messagings'): # add message _add_compose_create_msg(request, compose_obj) rpms_in_db = {} qs = package_models.RPM.objects.all() for rpm in qs.iterator(): key = "%s-%s:%s-%s.%s" % (rpm.name, rpm.epoch, rpm.version, rpm.release, rpm.arch) rpms_in_db[key] = rpm.id cursor = connection.cursor() add_to_changelog = [] imported_rpms = 0 for variant in ci.get_variants(recursive=True): _link_compose_to_integrated_product(request, compose_obj, variant) variant_type = release_models.VariantType.objects.get(name=variant.type) variant_obj, created = models.Variant.objects.get_or_create( compose=compose_obj, variant_id=variant.id, variant_uid=variant.uid, variant_name=variant.name, variant_type=variant_type ) if created: add_to_changelog.append(variant_obj) for arch in variant.arches: arch_obj = common_models.Arch.objects.get(name=arch) var_arch_obj, _ = models.VariantArch.objects.get_or_create(arch=arch_obj, variant=variant_obj) compose_rpms_in_db = set() qs = models.ComposeRPM.objects.filter(variant_arch=var_arch_obj).values_list('variant_arch_id', 'rpm_id') for (variant_arch_id, rpm_id) in qs.iterator(): key = "%s/%s" % (variant_arch_id, rpm_id) compose_rpms_in_db.add(key) sources = set() for srpm_nevra, rpms in rm.rpms.get(variant.uid, {}).get(arch, {}).iteritems(): sources.add(srpm_nevra) for rpm_nevra, rpm_data in rpms.iteritems(): imported_rpms += 1 path, filename = os.path.split(rpm_data['path']) rpm_id = get_or_insert_rpm(rpms_in_db, cursor, rpm_nevra, srpm_nevra, filename) sigkey_id = common_models.SigKey.get_cached_id(rpm_data["sigkey"], create=True) path_id = models.Path.get_cached_id(path, create=True) content_category = rpm_data["category"] content_category_id = repository_models.ContentCategory.get_cached_id(content_category) insert_compose_rpms_if_nonexist(compose_rpms_in_db, cursor, var_arch_obj.id, rpm_id, content_category_id, sigkey_id, path_id) for obj in add_to_changelog: lib._maybe_log(request, True, obj) request.changeset.add('notice', 0, 'null', json.dumps({ 'compose': compose_obj.compose_id, 'num_linked_rpms': imported_rpms, }))