Ejemplo n.º 1
0
def test_get_forge(clean_before_and_after, multiple_forge_projects):
    projects = list(GitProjectModel.get_forge(0, 10, "github.com"))
    assert projects
    assert len(projects) == 2

    projects = list(GitProjectModel.get_forge(0, 10, "gitlab.com"))
    assert len(projects) == 1

    projects = list(GitProjectModel.get_forge(0, 10, "git.stg.centos.org"))
    assert len(projects) == 1
Ejemplo n.º 2
0
def test_get_project_prs(clean_before_and_after, a_copr_build_for_pr):
    prs_a = GitProjectModel.get_project_prs(0, 10, "github.com",
                                            "the-namespace", "the-repo-name")
    assert prs_a is not None
    assert len(prs_a) == 1
    assert prs_a[
        0].id is not None  # cant explicitly check because its random like
    prs_b = GitProjectModel.get_project_prs(0, 10, "gitlab.com",
                                            "the-namespace", "the-repo-name")
    assert prs_b is None
    prs_c = GitProjectModel.get_project_prs(0, 10, "github", "the-namespace",
                                            "the-repo-name")
    assert prs_c is None
Ejemplo n.º 3
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    srpm_build = SRPMBuildModel()
    srpm_build.logs = "asd<br>qwe"

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build = srpm_build
    c.status = state
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = f"/copr-build/1/logs"
    logs_url = get_copr_build_log_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url)
    expected = (
        "<html><head>"
        f"<title>COPR build {project.namespace}/{project.repo_name}:"
        f" PR #{pr.pr_id}</title></head><body>"
        f"COPR build ID: {c.build_id}<br>"
        f"Submitted: {optional_time(c.build_submitted_time)}<br>"
        f"State: {c.status}<br><br>"
        f'Build web interface URL: <a href="{c.web_url}">{c.web_url}</a><br>'
        f'Build logs: <a href="{c.build_logs_url}">{c.build_logs_url}</a><br>'
        "SRPM creation logs:<br><br>"
        f"<pre>{c.srpm_build.logs}</pre>"
        "<br></body></html>")
    assert resp.data == expected.encode()
Ejemplo n.º 4
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "success"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    srpm = SRPMBuildModel()
    srpm.url = "https://some.random.copr.subdomain.org/my_srpm.srpm"

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build_id = 11
    c.status = state
    c.srpm_build = srpm
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"
    c.owner = "packit"
    c.project_name = "example_project"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = "/copr-build/1"
    logs_url = get_copr_build_info_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url).data.decode()
    assert f"srpm-build/{c.srpm_build_id}/logs" in resp
    assert c.web_url in resp
    assert c.build_logs_url in resp
    assert c.target in resp
    assert "Status: success" in resp
    assert "You can install" in resp

    assert "Download SRPM" in resp
    assert srpm.url in resp
Ejemplo n.º 5
0
    def get(self, forge):
        """List of projects of given forge (e.g. github.com, gitlab.com)"""

        result = []
        first, last = indices()

        for project in GitProjectModel.get_forge(first, last, forge):
            project_info = {
                "namespace": project.namespace,
                "repo_name": project.repo_name,
                "project_url": project.project_url,
                "prs_handled": len(project.pull_requests),
                "branches_handled": len(project.branches),
                "releases_handled": len(project.releases),
                "issues_handled": len(project.issues),
            }
            result.append(project_info)

        if not result:
            return response_maker([])

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*"
        return resp
Ejemplo n.º 6
0
    def get(self):
        """List all GitProjects"""

        result = []
        first, last = indices()

        projects_list = GitProjectModel.get_projects(first, last)
        if not projects_list:
            return ([], HTTPStatus.OK)
        for project in projects_list:
            project_info = {
                "namespace": project.namespace,
                "repo_name": project.repo_name,
                "project_url": project.project_url,
                "prs_handled": len(project.pull_requests),
                "branches_handled": len(project.branches),
                "releases_handled": len(project.releases),
                "issues_handled": len(project.issues),
            }
            result.append(project_info)

        resp = make_response(dumps(result), HTTPStatus.PARTIAL_CONTENT)
        resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*"
        resp.headers["Content-Type"] = "application/json"
        resp.headers["Access-Control-Allow-Origin"] = "*"
        return resp
Ejemplo n.º 7
0
def test_get_project_releases(clean_before_and_after, release_model):
    releases = GitProjectModel.get_project_releases("github.com",
                                                    "the-namespace",
                                                    "the-repo-name")
    assert releases[0].tag_name == "v1.0.2"
    assert releases[0].commit_hash == "80201a74d96c"
    assert len(releases) == 1
Ejemplo n.º 8
0
 def get(self, forge, namespace, repo_name):
     """Project branches"""
     branches = GitProjectModel.get_project_branches(
         forge, namespace, repo_name)
     if not branches:
         return response_maker([])
     result = []
     for branch in branches:
         branch_info = {
             "branch": branch.name,
             "builds": [],
             "tests": [],
         }
         for build in branch.get_copr_builds():
             build_info = {
                 "build_id": build.build_id,
                 "chroot": build.target,
                 "status": build.status,
                 "web_url": build.web_url,
             }
             branch_info["builds"].append(build_info)
         result.append(branch_info)
         for test_run in branch.get_test_runs():
             test_info = {
                 "pipeline_id": test_run.pipeline_id,
                 "chroot": test_run.target,
                 "status": test_run.status,
                 "web_url": test_run.web_url,
             }
             branch_info["tests"].append(test_info)
     return response_maker(result)
Ejemplo n.º 9
0
def test_get_project(clean_before_and_after, a_copr_build_for_pr):
    project = GitProjectModel.get_project(
        "github.com", "the-namespace", "the-repo-name"
    )
    assert project.namespace == "the-namespace"
    assert project.repo_name == "the-repo-name"
    assert project.project_url == "https://github.com/the-namespace/the-repo-name"
Ejemplo n.º 10
0
    def get(self):
        """List all GitProjects"""

        result = []
        first, last = indices()

        projects_list = GitProjectModel.get_projects(first, last)
        if not projects_list:
            return response_maker([])
        for project in projects_list:
            project_info = {
                "namespace": project.namespace,
                "repo_name": project.repo_name,
                "project_url": project.project_url,
                "prs_handled": len(project.pull_requests),
                "branches_handled": len(project.branches),
                "releases_handled": len(project.releases),
                "issues_handled": len(project.issues),
            }
            result.append(project_info)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*"
        return resp
Ejemplo n.º 11
0
def test_get_projects(clean_before_and_after, a_copr_build_for_pr):
    projects = GitProjectModel.get_projects(0, 10)
    assert isinstance(projects[0], GitProjectModel)
    assert projects[0].namespace == "the-namespace"
    assert projects[0].repo_name == "the-repo-name"
    assert projects[
        0].project_url == "https://github.com/the-namespace/the-repo-name"
Ejemplo n.º 12
0
    def get(self, forge, namespace, repo_name):
        """Project branches"""
        branches = GitProjectModel.get_project_branches(
            forge, namespace, repo_name)
        if not branches:
            return response_maker([])
        result = []
        for branch in branches:
            branch_info = {
                "branch": branch.name,
                "builds": [],
                "koji_builds": [],
                "srpm_builds": [],
                "tests": [],
            }

            for build in branch.get_copr_builds():
                build_info = {
                    "build_id": build.build_id,
                    "chroot": build.target,
                    "status": build.status,
                    "web_url": build.web_url,
                }
                branch_info["builds"].append(build_info)

            for build in branch.get_koji_builds():
                build_info = {
                    "build_id": build.build_id,
                    "chroot": build.target,
                    "status": build.status,
                    "web_url": build.web_url,
                }
                branch_info["koji_builds"].append(build_info)

            for build in branch.get_srpm_builds():
                build_info = {
                    "srpm_build_id":
                    build.id,
                    "success":
                    build.success,
                    "log_url":
                    url_for("builds.get_srpm_build_logs_by_id",
                            id_=build.id,
                            _external=True),
                }
                branch_info["srpm_builds"].append(build_info)

            for test_run in branch.get_test_runs():
                test_info = {
                    "pipeline_id": test_run.pipeline_id,
                    "chroot": test_run.target,
                    "status": test_run.status,
                    "web_url": test_run.web_url,
                }
                branch_info["tests"].append(test_info)
            result.append(branch_info)

        return response_maker(result)
Ejemplo n.º 13
0
 def get(self, forge, namespace, repo_name):
     """Project issues"""
     issues_list = GitProjectModel.get_project_issues(forge, namespace, repo_name)
     if not issues_list:
         return response_maker([])
     result = []
     for issue in issues_list:
         result.append(issue.issue_id)
     return response_maker(result)
Ejemplo n.º 14
0
 def get(self, forge, namespace, repo_name):
     """Project issues"""
     issues_list = GitProjectModel.get_project_issues(
         forge, namespace, repo_name)
     if not issues_list:
         return ([], HTTPStatus.OK)
     result = {"issues": []}
     for issue in issues_list:
         result["issues"].append(issue.issue_id)
     resp = make_response(dumps(result))
     resp.headers["Content-Type"] = "application/json"
     resp.headers["Access-Control-Allow-Origin"] = "*"
     return resp
Ejemplo n.º 15
0
 def get(self, forge, namespace, repo_name):
     """Project releases"""
     releases_list = GitProjectModel.get_project_releases(
         forge, namespace, repo_name)
     if not releases_list:
         return response_maker([])
     result = []
     for release in releases_list:
         release_info = {
             "tag_name": release.tag_name,
             "commit_hash": release.commit_hash,
         }
         result.append(release_info)
     return response_maker(result)
Ejemplo n.º 16
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build_id = 11
    c.status = state
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = "/copr-build/1"
    logs_url = get_copr_build_info_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url).data.decode()
    assert f"srpm-build/{c.srpm_build_id}/logs" in resp
    assert c.web_url in resp
    assert c.build_logs_url in resp
    assert c.target in resp
Ejemplo n.º 17
0
 def get(self, forge, namespace, repo_name):
     """Project releases"""
     releases_list = GitProjectModel.get_project_releases(
         forge, namespace, repo_name)
     if not releases_list:
         return ([], HTTPStatus.OK)
     result = []
     for release in releases_list:
         release_info = {
             "tag_name": release.tag_name,
             "commit_hash": release.commit_hash,
         }
         result.append(release_info)
     resp = make_response(dumps(result))
     resp.headers["Content-Type"] = "application/json"
     resp.headers["Access-Control-Allow-Origin"] = "*"
     return resp
Ejemplo n.º 18
0
    def get(self, forge, namespace, repo_name):
        """List PRs"""

        result = []
        first, last = indices()

        pr_list = GitProjectModel.get_project_prs(first, last, forge,
                                                  namespace, repo_name)
        if not pr_list:
            return response_maker([])
        for pr in pr_list:
            pr_info = {
                "pr_id": pr.pr_id,
                "builds": [],
                "tests": [],
            }
            copr_builds = []
            test_runs = []
            for build in pr.get_copr_builds():
                build_info = {
                    "build_id": build.build_id,
                    "chroot": build.target,
                    "status": build.status,
                    "web_url": build.web_url,
                }
                copr_builds.append(build_info)
            pr_info["builds"] = copr_builds
            for test_run in pr.get_test_runs():
                test_info = {
                    "pipeline_id": test_run.pipeline_id,
                    "chroot": test_run.target,
                    "status": str(test_run.status),
                    "web_url": test_run.web_url,
                }
                test_runs.append(test_info)
            pr_info["tests"] = test_runs

            result.append(pr_info)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT,
        )
        resp.headers["Content-Range"] = f"git-project-prs {first + 1}-{last}/*"
        return resp
Ejemplo n.º 19
0
 def get(self, forge, namespace, repo_name):
     """Project Details"""
     project = GitProjectModel.get_project(forge, namespace, repo_name)
     if not project:
         return response_maker(
             {"error": "No info about project stored in DB"},
             status=HTTPStatus.NOT_FOUND,
         )
     project_info = {
         "namespace": project.namespace,
         "repo_name": project.repo_name,
         "project_url": project.project_url,
         "prs_handled": len(project.pull_requests),
         "branches_handled": len(project.branches),
         "releases_handled": len(project.releases),
         "issues_handled": len(project.issues),
     }
     return response_maker(project_info)
Ejemplo n.º 20
0
 def get(self, forge, namespace):
     """List of projects of given forge and namespace"""
     result = []
     projects = GitProjectModel.get_namespace(forge, namespace)
     if not projects:
         return response_maker([])
     for project in projects:
         project_info = {
             "namespace": project.namespace,
             "repo_name": project.repo_name,
             "project_url": project.project_url,
             "prs_handled": len(project.pull_requests),
             "branches_handled": len(project.branches),
             "releases_handled": len(project.releases),
             "issues_handled": len(project.issues),
         }
         result.append(project_info)
     return response_maker(result)
Ejemplo n.º 21
0
def test_get_project_issues(clean_before_and_after, an_issue_model):
    issues_list = GitProjectModel.get_project_issues("github.com",
                                                     "the-namespace",
                                                     "the-repo-name")
    assert len(issues_list) == 1
    assert issues_list[0].issue_id == 2020
Ejemplo n.º 22
0
def test_get_project_branch(clean_before_and_after,
                            a_copr_build_for_branch_push):
    branches_list = GitProjectModel.get_project_branches(
        "github.com", "the-namespace", "the-repo-name")
    assert len(branches_list) == 1
    assert branches_list[0].name == "build-branch"
Ejemplo n.º 23
0
def test_get_namespace(clean_before_and_after, multiple_copr_builds):
    projects = GitProjectModel.get_namespace("github.com", "the-namespace")
    assert projects[0].namespace == "the-namespace"
    assert projects[0].repo_name == "the-repo-name"