25
25
from sqlobject import (
26
26
BoolCol, ForeignKey, IntCol, SQLObjectNotFound, StringCol)
27
from storm.expr import Count, Sum
27
28
from storm.store import Store
28
29
from zope.component import getUtility
29
30
from zope.interface import implements
36
37
from canonical.launchpad.webapp import urlappend
37
38
from canonical.launchpad.webapp.interfaces import NotFoundError
38
39
from canonical.launchpad.webapp.interfaces import (
39
IStoreSelector, MAIN_STORE, DEFAULT_FLAVOR)
40
IStoreSelector, MAIN_STORE, DEFAULT_FLAVOR, SLAVE_FLAVOR)
40
41
from canonical.lazr.utils import safe_hasattr
41
42
from canonical.librarian.utils import copy_and_close
42
43
from lp.buildmaster.interfaces.buildbase import BuildStatus
47
48
from lp.buildmaster.interfaces.buildfarmjobbehavior import (
48
49
BuildBehaviorMismatch)
49
50
from lp.buildmaster.interfaces.buildqueue import IBuildQueueSet
51
from lp.buildmaster.model.buildfarmjob import BuildFarmJob
50
52
from lp.buildmaster.model.buildfarmjobbehavior import IdleBuildBehavior
51
53
from lp.buildmaster.model.buildqueue import BuildQueue, specific_job_classes
54
from lp.buildmaster.model.packagebuild import PackageBuild
52
55
from canonical.database.sqlbase import SQLBase, sqlvalues
53
56
from lp.registry.interfaces.person import validate_public_person
54
57
from lp.services.job.interfaces.job import JobStatus
691
694
% arch.processorfamily.id,
692
695
clauseTables=("Processor",))
694
def getBuildQueueSizeForProcessor(self, processor, virtualized=False):
697
def getBuildQueueSizes(self):
695
698
"""See `IBuilderSet`."""
696
699
# Avoiding circular imports.
697
700
from lp.soyuz.model.archive import Archive
700
703
DistroArchSeries)
701
704
from lp.soyuz.model.processor import Processor
703
store = Store.of(processor)
708
Sum(BuildQueue.estimated_duration),
710
Archive.require_virtualized,
712
queue = store.using(*origin).find(
712
store = getUtility(IStoreSelector).get(MAIN_STORE, SLAVE_FLAVOR)
713
results = store.find(
714
715
BuildPackageJob.job == BuildQueue.jobID,
715
716
BuildPackageJob.build == BinaryPackageBuild.id,
716
BinaryPackageBuild.distroarchseries == DistroArchSeries.id,
717
BinaryPackageBuild.archive == Archive.id,
717
BinaryPackageBuild.package_build == PackageBuild.id,
718
PackageBuild.build_farm_job == BuildFarmJob.id,
719
PackageBuild.archive == Archive.id,
720
BinaryPackageBuild.distro_arch_series == DistroArchSeries.id,
718
721
DistroArchSeries.processorfamilyID == Processor.familyID,
719
BinaryPackageBuild.buildstate == BuildStatus.NEEDSBUILD,
720
Archive._enabled == True,
721
Processor.id == processor.id,
722
Archive.require_virtualized == virtualized,
725
return (queue.count(), queue.sum(BuildQueue.estimated_duration))
722
BuildFarmJob.status == BuildStatus.NEEDSBUILD,
723
Archive._enabled == True).group_by(
724
Processor, Archive.require_virtualized)
726
result_dict = {'virt': {}, 'nonvirt': {}}
727
for size, duration, processor, virtualized in results:
728
virt_str = 'virt' if virtualized else 'nonvirt'
729
result_dict[virt_str][processor.name] = (
727
734
def pollBuilders(self, logger, txn):
728
735
"""See IBuilderSet."""