~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# Copyright 2010 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

__metaclass__ = type

__all__ = [
    "DistributionJobType",
    "IDistributionJob",
    "IDistroSeriesDifferenceJob",
    "IDistroSeriesDifferenceJobSource",
    "IInitializeDistroSeriesJob",
    "IInitializeDistroSeriesJobSource",
    "InitializationCompleted",
    "InitializationPending",
]

from lazr.enum import (
    DBEnumeratedType,
    DBItem,
    )
from zope.interface import (
    Attribute,
    Interface,
    )
from zope.schema import (
    Int,
    Object,
    )

from canonical.launchpad import _
from lp.registry.interfaces.distribution import IDistribution
from lp.registry.interfaces.distroseries import IDistroSeries
from lp.services.job.interfaces.job import (
    IJob,
    IJobSource,
    IRunnableJob,
    )


class IDistributionJob(Interface):
    """A Job that initializes acts on a distribution."""

    id = Int(
        title=_('DB ID'), required=True, readonly=True,
        description=_("The tracking number for this job."))

    distribution = Object(
        title=_('The Distribution this job is about.'),
        schema=IDistribution, required=True)

    distroseries = Object(
        title=_('The DistroSeries this job is about.'),
        schema=IDistroSeries, required=False)

    job = Object(
        title=_('The common Job attributes'), schema=IJob, required=True)

    metadata = Attribute('A dict of data about the job.')

    def destroySelf():
        """Destroy this object."""


class DistributionJobType(DBEnumeratedType):

    INITIALIZE_SERIES = DBItem(1, """
        Initialize a Distro Series.

        This job initializes a given distro series, creating builds, and
        populating the archive from the parent distroseries.
        """)

    DISTROSERIESDIFFERENCE = DBItem(3, """
        Create, delete, or update a Distro Series Difference.

        Updates the status of a potential difference between a derived
        distribution release series and its parent series.
        """)


class InitializationPending(Exception):
    """The initialization of the distroseries has already been scheduled.

    :ivar job: The `InitializeDistroSeriesJob` that's already scheduled.
    """

    def __init__(self, job):
        super(InitializationPending, self).__init__()
        self.job = job


class InitializationCompleted(Exception):
    """The initialization of the distroseries has already been done.

    :ivar job: The `InitializeDistroSeriesJob` that's already scheduled.
    """

    def __init__(self, job):
        super(InitializationCompleted, self).__init__()
        self.job = job


class IInitializeDistroSeriesJobSource(IJobSource):
    """An interface for acquiring IInitializeDistroSeriesJobs."""

    def create(parents, arches, packagesets, rebuild, overlay,
               overlay_pockets, overlay_components):
        """Create a new initialization job for a distroseries."""

    def getPendingJobsForDistroseries(distroseries):
        """Retrieve pending initialization jobs for a distroseries.
        """


class IInitializeDistroSeriesJob(IRunnableJob):
    """A Job that performs actions on a distribution."""


class IDistroSeriesDifferenceJobSource(IJobSource):
    """An `IJob` for creating `DistroSeriesDifference`s."""

    def createForPackagePublication(derivedseries, sourcepackagename, pocket,
                                    parent_series=None):
        """Create jobs as appropriate for a given status publication.

        :param derived_series: A `DistroSeries` that is assumed to be
            derived from `parent_series`.
        :param sourcepackagename: A `SourcePackageName` that is being
            published in `derived_series` or `parent_series`.
        :param pocket: The `PackagePublishingPocket` for the publication.
        :param parent_series: The parent `DistroSeries` whose version of
            `sourcepackagename` is to be compared with that in
            `derived_series`.
        :return: An iterable of `DistroSeriesDifferenceJob`.
        """
        # XXX JeroenVermeulen 2011-05-26 bug=758906: Make parent_series
        # mandatory as part of multi-parent support.

    def getPendingJobsForDifferences(derived_series, distroseriesdifferences):
        """Find `DistroSeriesDifferenceJob`s for `DistroSeriesDifference`s.

        :param derived_series: The derived `DistroSeries` that the
            differences (and jobs) must be for.
        :param distroseriesdifferences:
            An iterable of `DistroSeriesDifference`s.
        :return: A dict mapping each of `distroseriesdifferences` that has
            pending jobs to a list of its jobs.
        """


class IDistroSeriesDifferenceJob(IRunnableJob):
    """A `Job` that performs actions related to `DistroSeriesDifference`s."""