Skip to content

Commit

Permalink
views.machine: dispay the number of packages built today
Browse files Browse the repository at this point in the history
  • Loading branch information
enku committed Jan 18, 2024
1 parent e4ed7bc commit b22bb4b
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ <h5 class="card-header">{{ build_count }} Build{{ build_count|pluralize }}</h5>
<li class="list-group-item d-flex justify-content-between align-items-center">
Storage/Build <span class="badge badge-primary badge-pill">{{ average_storage|numberize }}B</span>
</li>
<li class="list-group-item d-flex justify-content-between align-times-center">
Packages built today <span class="badge badge-primary badge-pill">{{ packages_built_today|length }}</span>
</li>
{% if published_build %}
<li class="list-group-item d-flex justify-content-between align-items-center">
repos.conf <a href="repos.conf" download><i class="bi bi-download"></i></a>
Expand Down
9 changes: 6 additions & 3 deletions src/gentoo_build_publisher/views/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,15 @@ class MachineContext(TypedDict):
"""machine view context"""

average_storage: float
chart_days: list[str]
build_count: int
builds: list[BuildRecord]
builds_over_time: list[list[int]]
chart_days: list[str]
gradient_colors: Gradient
latest_build: BuildRecord
machine: str
machines: list[str]
packages_built_today: list[Package]
published_build: Build | None
recent_packages: list[Package]
storage: int
Expand Down Expand Up @@ -147,7 +148,8 @@ class MachineInputContext(ViewInputContext):
def create_machine_context(input_context: MachineInputContext) -> MachineContext:
"""Return context for the machine view"""
sc = StatsCollector(input_context.publisher, input_context.cache)
chart_days = get_chart_days(input_context.now, input_context.days)
now = input_context.now
chart_days = get_chart_days(now, input_context.days)
machine = input_context.machine
machine_info = sc.machine_info(machine)
latest_build = sc.latest_build(machine)
Expand All @@ -158,7 +160,7 @@ def create_machine_context(input_context: MachineInputContext) -> MachineContext

return {
"average_storage": storage / machine_info.build_count,
"chart_days": days_strings(input_context.now, input_context.days),
"chart_days": days_strings(now, input_context.days),
"build_count": machine_info.build_count,
"builds": machine_info.builds,
"builds_over_time": [
Expand All @@ -168,6 +170,7 @@ def create_machine_context(input_context: MachineInputContext) -> MachineContext
"latest_build": latest_build,
"machine": machine,
"machines": [machine],
"packages_built_today": sc.packages_by_day(machine).get(now.date(), []),
"published_build": machine_info.published_build,
"recent_packages": sc.recent_packages(machine),
"storage": storage,
Expand Down
20 changes: 20 additions & 0 deletions src/gentoo_build_publisher/views/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,26 @@ def builds_by_day(self, machine: MachineName) -> dict[dt.date, int]:

return bbd

def packages_by_day(self, machine: MachineName) -> dict[dt.date, list[Package]]:
"""Return dict of machine's packages distributed by build date"""
if not (mi := self.machine_info(machine)):
return {}

pbd: dict[dt.date, list[Package]] = {}
for build in mi.builds:
if not build.submitted:
continue
date = localtime(build.built).date()

try:
metadata = self.publisher.storage.get_metadata(build)
except LookupError:
continue

pbd.setdefault(date, []).extend(metadata.packages.built)

return pbd


def days_strings(start: dt.datetime, days: int) -> list[str]:
"""Return list of datetimes from start as strings"""
Expand Down
43 changes: 31 additions & 12 deletions tests/test_views_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.utils import timezone

from gentoo_build_publisher.utils import Color
from gentoo_build_publisher.utils.time import localtime
from gentoo_build_publisher.utils.time import SECONDS_PER_DAY, localtime
from gentoo_build_publisher.views.context import (
MachineInputContext,
ViewInputContext,
Expand Down Expand Up @@ -127,6 +127,14 @@ def test_builds_over_time_and_build_recently(self) -> None:


class CreateMachineContextTests(TestCase):
def setUp(self) -> None:
super().setUp()

self.pf = package_factory()
ab: ArtifactFactory = self.artifact_builder
ab.initial_packages = []
ab.timer = int(localtime(dt.datetime(2024, 1, 16)).timestamp())

def input_context(self, **kwargs: Any) -> MachineInputContext:
defaults: dict[str, Any] = {
"cache": QuickCache(),
Expand All @@ -139,25 +147,36 @@ def input_context(self, **kwargs: Any) -> MachineInputContext:
return MachineInputContext(**defaults)

def test_average_storage(self) -> None:
pf = package_factory()
ab: ArtifactFactory = self.artifact_builder
ab.initial_packages = []
ab.timer = int(localtime(dt.datetime(2024, 1, 16)).timestamp())
total_size = 0
build_size = 0

for _builds in range(3):
ab.advance(3600)
build = BuildFactory(machine="babette")
for _ in range(3):
self.artifact_builder.advance(3600)
build = BuildFactory()
for _pkgs in range(3):
cpv = next(pf)
pkg = ab.build(build, cpv)
cpv = next(self.pf)
pkg = self.artifact_builder.build(build, cpv)
build_size += pkg.size
total_size += build_size
self.publisher.pull(build)

now = localtime(dt.datetime.fromtimestamp(ab.timer))
input_context = self.input_context(now=now, machine="babette")
now = localtime(dt.datetime.fromtimestamp(self.artifact_builder.timer))
input_context = self.input_context(now=now, machine=build.machine)
cxt = create_machine_context(input_context)

self.assertEqual(cxt["average_storage"], total_size / 3)

def test_packages_built_today(self) -> None:
for day in [1, 1, 1, 0]:
self.artifact_builder.advance(day * SECONDS_PER_DAY)
build = BuildFactory()
for _ in range(3):
cpv = next(self.pf)
self.artifact_builder.build(build, cpv)
self.publisher.pull(build)

now = localtime(dt.datetime.fromtimestamp(self.artifact_builder.timer))
input_context = self.input_context(now=now, machine=build.machine)
cxt = create_machine_context(input_context)

self.assertEqual(len(cxt["packages_built_today"]), 6)

0 comments on commit b22bb4b

Please sign in to comment.