Beispiel #1
0
    def get(self, id):
        """A specific koji build details."""
        build = KojiBuildModel.get_by_id(int(id))

        if not build:
            return response_maker(
                {"error": "No info about build stored in DB"},
                status=HTTPStatus.NOT_FOUND.value,
            )

        build_dict = {
            "build_id": build.build_id,
            "status": build.status,
            "chroot": build.target,
            "build_start_time": optional_timestamp(build.build_start_time),
            "build_finished_time":
            optional_timestamp(build.build_finished_time),
            "build_submitted_time":
            optional_timestamp(build.build_submitted_time),
            "commit_sha": build.commit_sha,
            "web_url": build.web_url,
            # from old data, sometimes build_logs_url is same and sometimes different to web_url
            "build_logs_url": build.build_logs_url,
            "srpm_build_id": build.get_srpm_build().id,
            "run_ids": sorted(run.id for run in build.runs),
        }

        build_dict.update(get_project_info_from_build(build))
        return response_maker(build_dict)
Beispiel #2
0
    def get(self, id):
        """A specific copr build details for one chroot."""
        build = CoprBuildModel.get_by_id(int(id))
        if not build:
            return response_maker(
                {"error": "No info about build stored in DB"},
                status=HTTPStatus.NOT_FOUND.value,
            )

        build_dict = {
            "build_id": build.build_id,
            "status": build.status,
            "chroot": build.target,
            "build_submitted_time":
            optional_timestamp(build.build_submitted_time),
            "build_start_time": optional_timestamp(build.build_start_time),
            "build_finished_time":
            optional_timestamp(build.build_finished_time),
            "commit_sha": build.commit_sha,
            "web_url": build.web_url,
            "build_logs_url": build.build_logs_url,
            "copr_project": build.project_name,
            "copr_owner": build.owner,
            "srpm_build_id": build.get_srpm_build().id,
            "run_ids": sorted(run.id for run in build.runs),
            "built_packages": build.built_packages,
        }

        build_dict.update(get_project_info_from_build(build))
        return response_maker(build_dict)
Beispiel #3
0
    def get(self, id):
        """A specific SRPM build details."""
        build = SRPMBuildModel.get_by_id(int(id))
        if not build:
            return response_maker(
                {"error": "No info about build stored in DB"},
                status=HTTPStatus.NOT_FOUND.value,
            )

        build_dict = {
            "status": build.status,
            "build_submitted_time":
            optional_timestamp(build.build_submitted_time),
            "build_start_time": optional_timestamp(build.build_start_time),
            "build_finished_time":
            optional_timestamp(build.build_finished_time),
            "url": build.url,
            "logs": build.logs,
            "logs_url": build.logs_url,
            "copr_build_id": build.copr_build_id,
            "copr_web_url": build.copr_web_url,
            "run_ids": sorted(run.id for run in build.runs),
        }

        build_dict.update(get_project_info_from_build(build))
        return response_maker(build_dict)
Beispiel #4
0
def process_runs(runs):
    """
    Process `RunModel`s and construct a JSON that is returned from the endpoints
    that return merged chroots.

    Args:
        runs: Iterator over merged `RunModel`s.

    Returns:
        List of JSON objects where each represents pipelines run on single SRPM.
    """
    result = []

    for pipeline in runs:
        response_dict = {
            "merged_run_id": pipeline.merged_id,
            "srpm": None,
            "copr": [],
            "koji": [],
            "test_run": [],
        }

        srpm_build = SRPMBuildModel.get_by_id(pipeline.srpm_build_id)
        if srpm_build:
            response_dict["srpm"] = {
                "packit_id": srpm_build.id,
                "status": srpm_build.status,
            }
            response_dict["time_submitted"] = optional_timestamp(
                srpm_build.build_submitted_time)
            response_dict["trigger"] = get_project_info_from_build(srpm_build)

        for model_type, Model, packit_ids in (
            ("copr", CoprBuildModel, pipeline.copr_build_id),
            ("koji", KojiBuildModel, pipeline.koji_build_id),
            ("test_run", TFTTestRunModel, pipeline.test_run_id),
        ):
            for packit_id in set(
                    filter(None, map(lambda ids: ids[0], packit_ids))):
                row = Model.get_by_id(packit_id)
                if row.status == "waiting_for_srpm":
                    continue
                response_dict[model_type].append({
                    "packit_id": packit_id,
                    "target": row.target,
                    "status": row.status,
                })
                if "trigger" not in response_dict:
                    submitted_time = (row.submitted_time if isinstance(
                        row, TFTTestRunModel) else row.build_submitted_time)
                    response_dict["time_submitted"] = optional_timestamp(
                        submitted_time)
                    response_dict["trigger"] = get_project_info_from_build(row)

        result.append(response_dict)

    return result
Beispiel #5
0
    def get(self):
        """List all SRPM builds."""

        result = []

        first, last = indices()
        for build in SRPMBuildModel.get(first, last):
            build_dict = {
                "srpm_build_id":
                build.id,
                "success":
                build.success,
                "log_url":
                get_srpm_build_info_url(build.id),
                "build_submitted_time":
                optional_timestamp(build.build_submitted_time),
            }
            project = build.get_project()

            # Its possible that jobtrigger isnt stored in db
            if project:
                build_dict["repo_namespace"] = project.namespace
                build_dict["repo_name"] = project.repo_name
                build_dict["project_url"] = project.project_url
                build_dict["pr_id"] = build.get_pr_id()
                build_dict["branch_name"] = build.get_branch_name()

            result.append(build_dict)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"srpm-builds {first + 1}-{last}/*"
        return resp
Beispiel #6
0
    def get(self):
        """List all Testing Farm  results."""

        result = []

        first, last = indices()
        # results have nothing other than ref in common, so it doesnt make sense to
        # merge them like copr builds
        for tf_result in TFTTestRunModel.get_range(first, last):
            result_dict = {
                "packit_id": tf_result.id,
                "pipeline_id": tf_result.pipeline_id,
                "ref": tf_result.commit_sha,
                "status": tf_result.status,
                "target": tf_result.target,
                "web_url": tf_result.web_url,
                "pr_id": tf_result.get_pr_id(),
                "submitted_time": optional_timestamp(tf_result.submitted_time),
            }

            project = tf_result.get_project()
            result_dict["repo_namespace"] = project.namespace
            result_dict["repo_name"] = project.repo_name
            result_dict["project_url"] = project.project_url

            result.append(result_dict)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"test-results {first + 1}-{last}/*"
        return resp
Beispiel #7
0
    def get(self):
        """List all Copr builds."""

        # Return relevant info thats concise
        # Usecases like the packit-dashboard copr-builds table

        result = []

        first, last = indices()
        for build in CoprBuildModel.get_merged_chroots(first, last):
            build_info = CoprBuildModel.get_by_build_id(build.build_id, None)
            if build_info.status == "waiting_for_srpm":
                continue
            project_info = build_info.get_project()
            build_dict = {
                "packit_id":
                build_info.id,
                "project":
                build_info.project_name,
                "build_id":
                build.build_id,
                "status_per_chroot": {},
                "packit_id_per_chroot": {},
                "build_submitted_time":
                optional_timestamp(build_info.build_submitted_time),
                "web_url":
                build_info.web_url,
                "ref":
                build_info.commit_sha,
                "pr_id":
                build_info.get_pr_id(),
                "branch_name":
                build_info.get_branch_name(),
                "repo_namespace":
                project_info.namespace,
                "repo_name":
                project_info.repo_name,
                "project_url":
                project_info.project_url,
            }

            for i, chroot in enumerate(build.target):
                # [0] because sqlalchemy returns a single element sub-list
                build_dict["status_per_chroot"][chroot[0]] = build.status[i][0]
                build_dict["packit_id_per_chroot"][
                    chroot[0]] = build.packit_id_per_chroot[i][0]

            result.append(build_dict)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"copr-builds {first + 1}-{last}/*"
        return resp
Beispiel #8
0
    def get(self):
        """List all Koji builds."""

        first, last = indices()
        result = []

        for build in KojiBuildModel.get_range(first, last):
            build_dict = {
                "packit_id":
                build.id,
                "build_id":
                build.build_id,
                "status":
                build.status,
                "build_submitted_time":
                optional_timestamp(build.build_submitted_time),
                "chroot":
                build.target,
                "web_url":
                build.web_url,
                # from old data, sometimes build_logs_url is same and sometimes different to web_url
                "build_logs_url":
                build.build_logs_url,
                "pr_id":
                build.get_pr_id(),
                "branch_name":
                build.get_branch_name(),
                "release":
                build.get_release_tag(),
            }

            project = build.get_project()
            if project:
                build_dict["project_url"] = project.project_url
                build_dict["repo_namespace"] = project.namespace
                build_dict["repo_name"] = project.repo_name

            result.append(build_dict)

        resp = response_maker(
            result,
            status=HTTPStatus.PARTIAL_CONTENT.value,
        )
        resp.headers["Content-Range"] = f"koji-builds {first + 1}-{last}/*"
        return resp
Beispiel #9
0
    def get(self, id):
        """A specific test run details."""
        test_run_model = TFTTestRunModel.get_by_id(int(id))

        if not test_run_model:
            return response_maker(
                {"error": "No info about build stored in DB"},
                status=HTTPStatus.NOT_FOUND.value,
            )

        test_result_dict = {
            "pipeline_id": test_run_model.pipeline_id,
            "status": test_run_model.status,
            "chroot": test_run_model.target,
            "commit_sha": test_run_model.commit_sha,
            "web_url": test_run_model.web_url,
            "copr_build_id": test_run_model.runs[0].copr_build_id,
            "run_ids": sorted(run.id for run in test_run_model.runs),
            "submitted_time":
            optional_timestamp(test_run_model.submitted_time),
        }

        test_result_dict.update(get_project_info_from_build(test_run_model))
        return response_maker(test_result_dict)