Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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
Example #6
0
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)
Example #7
0
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()
Example #8
0
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()
Example #9
0
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))
Example #10
0
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))
Example #11
0
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()
Example #12
0
    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))