1017
1018 elif 500 <= self.status_code < 600:
1019 http_error_msg = (
1020 f"{self.status_code} Server Error: {reason} for url: {self.url}"
1021 )
1022
1023 if http_error_msg:
--> 1024 raise HTTPError(http_error_msg, response=self)
1025
1026 def close(self):
1027 """Releases the connection back to the pool. Once this method has been
1028 called the underlying ``raw`` object must not be accessed again.
1029
1030 *Note: Should not normally need to be called explicitly.*
The server encountered an internal error
self.cookies = The server encountered an internal error
self.url = 'https://koji.fedoraproject.org/kojihub'
Internal Server Error
\n
3076 _val = '0x' + _val.hex()
3077 if len(_val) > 1024:
3078 _val = _val[:1024] + '...'
3079 self.logger.debug("%s: %r" % (_key, _val))
3080 with warnings.catch_warnings():
3081 warnings.simplefilter("ignore")
3082 r = self.rsession.post(handler, **callopts)
--> 3083 r.raise_for_status()
3084 hub_version = r.headers.get('Koji-Version')
3085 if hub_version:
3086 self.__hub_version = hub_version
3087 try:
3088 ret = self._read_xmlrpc_response(r)
3089 finally:
3028 exc.request.url = self._sanitize_url(exc.request.url)
3029 return exc
3030
3031 def _sendCall(self, handler, headers, request):
3032 # handle expired connections
3033 for i in (0, 1):
3034 try:
--> 3035 return self._sendOneCall(handler, headers, request)
3036 except Exception as e:
3037 e = self._sanitize_connection_error(e)
3038 if i or not is_conn_error(e):
3039 raise e
3040 self.logger.debug("Connection Error: %s", e)
3041 self.new_session()
3032 # handle expired connections
3033 for i in (0, 1):
3034 try:
3035 return self._sendOneCall(handler, headers, request)
3036 except Exception as e:
3037 e = self._sanitize_connection_error(e)
3038 if i or not is_conn_error(e):
--> 3039 raise e
3040 self.logger.debug("Connection Error: %s", e)
3041 self.new_session()
3042
3043 def _sendOneCall(self, handler, headers, request):
3044 headers = dict(headers)
3045 callopts = {
3139 max_retries = self.opts.get('max_retries', 30)
3140 interval = self.opts.get('retry_interval', 20)
3141 err = None
3142 while True:
3143 tries += 1
3144 self.retries += 1
3145 try:
--> 3146 return self._sendCall(handler, headers, request)
3147 # basically, we want to retry on most errors, with a few exceptions
3148 # - faults (this means the call completed and failed)
3149 # - SystemExit, KeyboardInterrupt
3150 # note that, for logged-in sessions the server should tell us (via a RetryError
3151 # fault) if the call cannot be retried. For non-logged-in sessions, all calls
3152 # should be read-only and hence retryable.
3113 self.logged_in = False
3114 auth_method(*args, **kwargs)
3115
3116 def renew_expired_session(func):
3117 """Decorator to renew expirated session or subsession."""
3118 def _renew_expired_session(self, *args, **kwargs):
3119 try:
--> 3120 return func(self, *args, **kwargs)
3121 except AuthExpired:
3122 self._renew_session()
3123 return func(self, *args, **kwargs)
3124 return _renew_expired_session
3125
3126 @renew_expired_session
2529 self.__name = name
2530 self.__session = session
2531
2532 def __getattr__(self, name):
2533 return type(self)(self.__func, "%s.%s" % (self.__name, name))
2534
2535 def __call__(self, *args, **opts):
--> 2536 return self.__func(self.__name, args, opts)
2537
2538 @property
2539 def __doc__(self):
2540 if self.__session is None:
2541 # There could be potentially session-less object
2542 return None
532 # know the path.
533 if "path_from_task" in rpm_info:
534 return self.downloader.get_file(rpm_info["path_from_task"])
535
536 pathinfo = self.koji_wrapper.koji_module.pathinfo
537 paths = []
538
--> 539 if "getRPMChecksums" in self.koji_proxy.system.listMethods():
540
541 def checksum_validator(keyname, pkg_path):
542 checksums = self.koji_proxy.getRPMChecksums(
543 rpm_info["id"], checksum_types=("sha256",)
544 )
545 if "sha256" in checksums.get(keyname, {}):
62 # rpm_info, build_info = item
63
64 if (num % 100 == 0) or (num == self.pool.queue_total):
65 self.pool.package_set.log_debug(
66 "Processed %s out of %s packages" % (num, self.pool.queue_total)
67 )
68
--> 69 rpm_path = self.pool.package_set.get_package_path(item)
70 if rpm_path is None:
71 return
72
73 # In case we have old file cache data, try to reuse it.
74 if self.pool.package_set.old_file_cache:
75 # Try to find the RPM in old_file_cache and reuse it instead of
60
61 self.pool.queue_get_lock.acquire()
62 self.pool.queue_processed += 1
63 num = self.pool.queue_processed
64 self.pool.queue_get_lock.release()
65
66 try:
--> 67 self.process(item, num)
68 except:
69 self.failed = True
70 self.pool.exceptions.append(sys.exc_info())
71 self.pool.kill()
72
73 def process(self, item, num):
712
713 def reraise(tp, value, tb=None):
714 try:
715 if value is None:
716 value = tp()
717 if value.__traceback__ is not tb:
718 raise value.with_traceback(tb)
--> 719 raise value
720 finally:
721 value = None
722 tb = None
723
724 else:
725 def exec_(_code_, _globs_=None, _locs_=None):
113 """
114 for i in self.threads:
115 i.running = False
116 for i in self.threads:
117 i.join()
118 if self.exceptions:
119 exc_info = self.exceptions[0]
--> 120 six.reraise(exc_info[0], exc_info[1], exc_info[2])
121
122 def kill(self):
123 for i in self.threads:
124 i.kill = True
125 i.running = False
126
188 srpm_pool.add(ReaderThread(srpm_pool))
189 rpm_pool.add(ReaderThread(rpm_pool))
190
191 # process SRC and NOSRC packages first (see ReaderTread for the
192 # EXCLUDEARCH/EXCLUSIVEARCH hack for noarch packages)
193 self.log_debug("Package set: spawning %s worker threads (SRPMs)" % thread_count)
194 srpm_pool.start()
--> 195 srpm_pool.stop()
196 self.log_debug("Package set: worker threads stopped (SRPMs)")
197
198 self.log_debug("Package set: spawning %s worker threads (RPMs)" % thread_count)
199 rpm_pool.start()
200 rpm_pool.stop()
201 self.log_debug("Package set: worker threads stopped (RPMs)")
705
706 if skipped_packages_count:
707 self.log_debug(
708 "Skipped %d packages, not marked as to be "
709 "included in a compose." % skipped_packages_count
710 )
711
--> 712 result = self.read_packages(result_rpms, result_srpms)
713
714 # Check that after reading the packages, every package that is
715 # included in a compose has the right sigkey.
716 if self._invalid_sigkey_rpms:
717 invalid_sigkey_rpms = [
718 rpm for rpm in self._invalid_sigkey_rpms if rpm["name"] in self.packages
904 compose,
905 compose_tag,
906 inherit=should_inherit,
907 include_packages=modular_packages,
908 )
909
910 if pkgset.reuse is None:
--> 911 pkgset.populate(
912 compose_tag,
913 # We care about packages as they existed on the specified
914 # event. However, modular content tags are not expected to
915 # change, so the event doesn't matter there. If an exact NSVC
916 # of a module is specified, the code above would happily find
917 # its content tag, but fail here if the content tag doesn't
195 self.koji_wrapper = pungi.wrappers.kojiwrapper.KojiWrapper(compose)
196 package_sets = get_pkgset_from_koji(self.compose, self.koji_wrapper)
197 return (package_sets, self.compose.koji_downloader.path_prefix)
198
199
200 def get_pkgset_from_koji(compose, koji_wrapper):
201 event_info = get_koji_event_info(compose, koji_wrapper)
--> 202 return populate_global_pkgset(compose, koji_wrapper, event_info)
203
204
205 def _add_module_to_variant(
206 koji_wrapper,
207 variant,
208 build,
189 return modules
190
191
192 class PkgsetSourceKoji(pungi.phases.pkgset.source.PkgsetSourceBase):
193 def __call__(self):
194 compose = self.compose
195 self.koji_wrapper = pungi.wrappers.kojiwrapper.KojiWrapper(compose)
--> 196 package_sets = get_pkgset_from_koji(self.compose, self.koji_wrapper)
197 return (package_sets, self.compose.koji_downloader.path_prefix)
198
199
200 def get_pkgset_from_koji(compose, koji_wrapper):
201 event_info = get_koji_event_info(compose, koji_wrapper)
202 return populate_global_pkgset(compose, koji_wrapper, event_info)
29 self.path_prefix = None
30
31 def run(self):
32 from . import sources
33
34 SourceClass = sources.ALL_SOURCES[self.compose.conf["pkgset_source"].lower()]
35
--> 36 self.package_sets, self.path_prefix = SourceClass(self.compose)()
37
38 def validate(self):
39 extra_tasks = self.compose.conf.get("pkgset_koji_scratch_tasks", None)
40 sigkeys = tuple(self.compose.conf["sigkeys"] or [None])
41 if extra_tasks is not None and None not in sigkeys and "" not in sigkeys:
42 raise ValueError(
59 if self._skipped:
60 self.compose.log_warning("[SKIP ] %s" % self.msg)
61 self.finished = True
62 return
63 self._start_time = time.time()
64 self.compose.log_info("[BEGIN] %s" % self.msg)
65 self.compose.notifier.send("phase-start", phase_name=self.name)
--> 66 self.run()
67
68 def get_config_block(self, variant, arch=None):
69 """In config for current phase, find a block corresponding to given
70 variant and arch. The arch should be given if and only if the config
71 uses variant/arch mapping.
72 """
463 compose.log_error(i)
464 print(i)
465 raise RuntimeError("Configuration is not valid")
466
467 init_phase.start()
468 init_phase.stop()
469
--> 470 pkgset_phase.start()
471 pkgset_phase.stop()
472
473 # WEAVER phase - launches other phases which can safely run in parallel
474 essentials_schema = (
475 buildinstall_phase,
476 (gather_phase, createrepo_phase),
345 logger.error("Config validation failed with the error: %s" % error)
346 fail_to_start("Config validation failed", errors=errors)
347 sys.exit(1)
348
349 notifier.compose = compose
350 COMPOSE = compose
351 try:
--> 352 run_compose(
353 compose,
354 create_latest_link=create_latest_link,
355 latest_link_status=latest_link_status,
356 latest_link_components=latest_link_components,
357 )
358 except UnsignedPackagesError:
646
647
648 def cli_main():
649 signal.signal(signal.SIGINT, sigterm_handler)
650 signal.signal(signal.SIGTERM, sigterm_handler)
651
652 try:
--> 653 main()
654 except (Exception, KeyboardInterrupt) as ex:
655 if COMPOSE:
656 COMPOSE.log_error("Compose run failed: %s" % ex)
657 COMPOSE.traceback(show_locals=getattr(ex, "show_locals", True))
658 COMPOSE.log_critical("Compose failed: %s" % COMPOSE.topdir)
659 COMPOSE.write_status("DOOMED")