Source code for evergreen.build

# -*- encoding: utf-8 -*-
"""Representation of an evergreen build."""
from __future__ import absolute_import

from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional

from evergreen.base import _BaseEvergreenObject, evg_attrib, evg_datetime_attrib
from evergreen.metrics.buildmetrics import BuildMetrics

if TYPE_CHECKING:
    from evergreen.api import EvergreenApi
    from evergreen.task import Task  # noqa: F401
    from evergreen.version import Version

EVG_BUILD_STATUS_FAILED = "failed"
EVG_BUILD_STATUS_SUCCESS = "success"
EVG_BUILD_STATUS_CREATED = "created"

COMPLETED_STATES = {
    EVG_BUILD_STATUS_FAILED,
    EVG_BUILD_STATUS_SUCCESS,
}


[docs]class StatusCounts(_BaseEvergreenObject): """Representation of Evergreen StatusCounts.""" succeeded = evg_attrib("succeeded") failed = evg_attrib("failed") started = evg_attrib("started") undispatched = evg_attrib("undispatched") inactivate = evg_attrib("inactive") dispatched = evg_attrib("dispatched") timed_out = evg_attrib("timed_out") def __init__(self, json: Dict[str, Any], api: "EvergreenApi") -> None: """ Create a Status Counts object. :param json: Json of status counts object. :param api: Evergreen API. """ super(StatusCounts, self).__init__(json, api)
[docs]class Build(_BaseEvergreenObject): """Representation of an Evergreen build.""" id = evg_attrib("_id") project_id = evg_attrib("project_id") project_identifier = evg_attrib("project_identifier") create_time = evg_datetime_attrib("create_time") start_time = evg_datetime_attrib("start_time") finish_time = evg_datetime_attrib("finish_time") version = evg_attrib("version") branch = evg_attrib("branch") git_hash = evg_attrib("git_hash") build_variant = evg_attrib("build_variant") status = evg_attrib("status") activated = evg_attrib("activated") activated_by = evg_attrib("activated_by") activated_time = evg_datetime_attrib("activated_time") order = evg_attrib("order") tasks = evg_attrib("tasks") time_taken_ms = evg_attrib("time_taken_ms") display_name = evg_attrib("display_name") predicted_makespan_ms = evg_attrib("predicted_makespan_ms") actual_makespan_ms = evg_attrib("actual_makespan_ms") origin = evg_attrib("origin") def __init__(self, json: Dict[str, Any], api: "EvergreenApi") -> None: """ Create an instance of an evergreen task. :param json: Json of build object. :param api: Evergreen API. """ super(Build, self).__init__(json, api) @property def status_counts(self) -> StatusCounts: """Get the status counts of the build.""" return StatusCounts(self.json["status_counts"], self._api)
[docs] def get_project_identifier(self) -> str: """ Return the human-readable project id. Can also be accessed as an attribute. :return: Human-readable project id. """ return self.project_identifier
[docs] def get_tasks(self, fetch_all_executions: bool = False) -> List["Task"]: """ Get all tasks for this build. :param fetch_all_executions: fetch all executions for tasks. :return: List of all tasks. """ return self._api.tasks_by_build(self.id, fetch_all_executions)
[docs] def is_completed(self) -> bool: """ Determine if this build has completed running tasks. :return: True if build has completed running tasks. """ return self.status in COMPLETED_STATES
[docs] def get_metrics(self, task_filter_fn: Optional[Callable] = None) -> Optional[BuildMetrics]: """ Get metrics for the build. Metrics are only available on build that have finished running.. :param task_filter_fn: function to filter tasks included for metrics, should accept a task argument. :return: Metrics for the build. """ if self.status != EVG_BUILD_STATUS_CREATED: return BuildMetrics(self).calculate(task_filter_fn) return None
[docs] def get_version(self) -> "Version": """ Get the version this build is a part of. :return: Version that this build is a part of. """ return self._api.version_by_id(self.version)
def __repr__(self) -> str: """ Get a string representation of Task for debugging purposes. :return: String representation of Task. """ return "Build({id})".format(id=self.id)