def test_createrepo_conditional_false(mc_client, mc_create_unsafe): mc_client.return_value.get_project_details.return_value = MagicMock(data={"detail": {"auto_createrepo": False}}) base_url = "http://example.com/repo/" createrepo(path="/tmp/", username="******", projectname="bar", base_url=base_url, devel=True) assert mc_create_unsafe.call_args == mock.call('/tmp/', dest_dir='devel', base_url=base_url)
def check_signed_rpms_in_pkg_dir(pkg_dir, user, project, chroot, chroot_dir, opts): success = True logger = create_file_logger("run.check_signed_rpms_in_pkg_dir", "/tmp/copr_check_signed_rpms.log") try: sign_rpms_in_dir(user, project, pkg_dir, opts, log=logger) log.info("running createrepo for {}".format(pkg_dir)) base_url = "/".join([opts.results_baseurl, user, project, chroot]) createrepo( path=chroot_dir, front_url=opts.frontend_base_url, base_url=base_url, username=user, projectname=project, ) except Exception as err: success = False log.error(">>> Failed to check/sign rpm in dir pkg_dir") log.exception(err) return success
def check_signed_rpms_in_pkg_dir(pkg_dir, user, project, chroot, chroot_dir, opts): success = True class LogCb(object): def __init__(self, logger): self.logger = logger def log(self, msg): self.logger.info(">>> {}".format(msg)) def error(self, msg): self.logger.error(">>> {}".format(msg)) cb = LogCb(log) try: sign_rpms_in_dir(user, project, pkg_dir, opts, callback=cb) log.info("running createrepo for {}".format(pkg_dir)) base_url = "/".join([opts.results_baseurl, user, project, chroot]) createrepo( path=chroot_dir, front_url=opts.frontend_base_url, base_url=base_url, username=user, projectname=project, ) except Exception as err: success = False log.error(">>> Failed to check/sign rpm in dir pkg_dir") log.exception(err) return success
def test_createrepo_conditional_false(mc_client, mc_create_unsafe): mc_client.return_value.get_project_details.return_value = MagicMock(data={"detail": {"auto_createrepo": False}}) base_url = "http://example.com/repo/" createrepo(path="/tmp/", front_url="http://example.com/api", username="******", projectname="bar", base_url=base_url, lock=None) assert mc_create_unsafe.call_args == mock.call('/tmp/', None, dest_dir='devel', base_url=base_url)
def test_createrepo_conditional_true(mc_client, mc_add_appdata, mc_create_unsafe): mc_client.return_value.get_project_details.return_value = MagicMock(data={"detail": {}}) mc_create_unsafe.return_value = "" mc_add_appdata.return_value = "" createrepo(path="/tmp/", username="******", projectname="bar") mc_create_unsafe.reset_mock() mc_client.return_value.get_project_details.return_value = MagicMock( data={"detail": {"auto_createrepo": True}}) createrepo(path="/tmp/", username="******", projectname="bar") mc_create_unsafe.reset_mock()
def test_createrepo_conditional_true(mc_client, mc_create_unsafe): mc_client.return_value.get_project_details.return_value = MagicMock(data={"detail": {}}) createrepo(path="/tmp/", front_url="http://example.com/api", username="******", projectname="bar", lock=None) mc_create_unsafe.reset_mock() mc_client.return_value.get_project_details.return_value = MagicMock( data={"detail": {"auto_createrepo": True}}) createrepo(path="/tmp/", front_url="http://example.com/api", username="******", projectname="bar", lock=None) mc_create_unsafe.reset_mock()
def main(args): parser = SortedOptParser("copr_create_repo") parser.add_option("-u", "--user", dest="user", help="copr project owner username") parser.add_option("-p", "--project", dest="project", help="copr project name") parser.add_option("-f", "--front_url", dest="front_url", help="copr frontend url") cli_opts, args = parser.parse_args(args) if not cli_opts.user: print("No user was specified, exiting", file=sys.stderr) sys.exit(1) if not cli_opts.project: print("No project was specified, exiting", file=sys.stderr) sys.exit(1) opts = BackendConfigReader().read() front_url = cli_opts.front_url or opts.frontend_base_url project_path = os.path.join(opts.destdir, cli_opts.user, cli_opts.project) log.info("start processing {}/{}".format(cli_opts.user, cli_opts.project)) for subdir in os.listdir(project_path): if os.path.isdir(subdir): path = os.path.join(project_path, subdir) log.info("entering dir: {}".format(subdir)) createrepo(path=path, front_url=front_url, username=cli_opts.user, projectname=cli_opts.project) log.info("done dir: {}".format(subdir)) log.info("finished processing {}/{}".format(cli_opts.user, cli_opts.project))
def main(args): parser = SortedOptParser( "copr_create_repo") parser.add_option("-u", "--user", dest="user", help="copr project owner username") parser.add_option("-p", "--project", dest="project", help="copr project name") parser.add_option("-f", "--front_url", dest="front_url", help="copr frontend url") cli_opts, args = parser.parse_args(args) if not cli_opts.user: print("No user was specified, exiting", file=sys.stderr) sys.exit(1) if not cli_opts.project: print("No project was specified, exiting", file=sys.stderr) sys.exit(1) opts = BackendConfigReader().read() front_url = cli_opts.front_url or opts.frontend_base_url project_path = os.path.join(opts.destdir, cli_opts.user, cli_opts.project) log.info("start processing {}/{}".format(cli_opts.user, cli_opts.project)) for subdir in os.listdir(project_path): if os.path.isdir(subdir): path = os.path.join(project_path, subdir) log.info("entering dir: {}".format(subdir)) createrepo(path=path, front_url=front_url, username=cli_opts.user, projectname=cli_opts.project) log.info("done dir: {}".format(subdir)) log.info("finished processing {}/{}".format(cli_opts.user, cli_opts.project))
def test_createrepo_conditional_true(mc_client, mc_create_unsafe): mc_client.return_value.get_project_details.return_value = MagicMock( data={"detail": {}}) createrepo(path="/tmp/", front_url="http://example.com/api", username="******", projectname="bar", lock=None) mc_create_unsafe.reset_mock() mc_client.return_value.get_project_details.return_value = MagicMock( data={"detail": { "auto_createrepo": True }}) createrepo(path="/tmp/", front_url="http://example.com/api", username="******", projectname="bar", lock=None) mc_create_unsafe.reset_mock()
def prune_project(self, project_path, username, projectdir): loginfo("Going to prune {}/{}".format(username, projectdir)) projectname = projectdir.split(':', 1)[0] loginfo("projectname = {}".format(projectname)) try: if not get_auto_createrepo_status(self.opts.frontend_base_url, username, projectname): loginfo("Skipped {}/{} since auto createrepo option is disabled" .format(username, projectdir)) return if get_persistent_status(self.opts.frontend_base_url, username, projectname): loginfo("Skipped {}/{} since the project is persistent" .format(username, projectdir)) return if not get_auto_prune_status(self.opts.frontend_base_url, username, projectname): loginfo("Skipped {}/{} since auto-prunning is disabled for the project" .format(username, projectdir)) return except (CoprException, CoprRequestException) as exception: logerror("Failed to get project details for {}/{} with error: {}".format( username, projectdir, exception)) return for sub_dir_name in os.listdir(project_path): chroot_path = os.path.join(project_path, sub_dir_name) if sub_dir_name == 'modules': continue if not os.path.isdir(chroot_path): continue if sub_dir_name not in self.chroots: loginfo("Final pruning already done for chroot {}/{}:{}".format(username, projectdir, sub_dir_name)) continue if self.mtime_optimization: # We only ever remove builds that were done at least # 'self.prune_days' ago. And because we run prunerepo _daily_ # we know that the candidates for removal (if there are such) # are removed about a day after "build_time + self.prune_days". touched_before = time.time()-os.stat(chroot_path).st_mtime touched_before = touched_before/3600/24 # seconds -> days # Because it might happen that prunerepo has some problems to # successfully go through the directory for some time (bug, user # error, I/O problems...) we rather wait 10 more days till we # really start to ignore the directory. if touched_before > int(self.prune_days) + 10: loginfo("Skipping {} - not changed for {} days".format( sub_dir_name, touched_before)) continue try: cmd = ['prunerepo', '--verbose', '--days', str(self.prune_days), '--nocreaterepo', chroot_path] stdout = runcmd(cmd) loginfo(stdout) createrepo(path=chroot_path, front_url=self.opts.frontend_base_url, username=username, projectname=projectname, override_acr_flag=True) clean_copr(chroot_path, self.prune_days, verbose=True) except Exception as err: logexception(err) logerror("Error pruning chroot {}/{}:{}".format(username, projectdir, sub_dir_name)) loginfo("Pruning done for chroot {}/{}:{}".format(username, projectdir, sub_dir_name)) loginfo("Pruning finished for projectdir {}/{}".format(username, projectdir))