Merge lp:~wgrant/launchpad/ppa-reset-2.0-model into lp:launchpad

Proposed by William Grant
Status: Merged
Merged at revision: 17049
Proposed branch: lp:~wgrant/launchpad/ppa-reset-2.0-model
Merge into: lp:launchpad
Prerequisite: lp:~wgrant/launchpad/ppa-reset-2.0-db
Diff against target: 206 lines (+90/-1)
5 files modified
lib/lp/buildmaster/enums.py (+32/-0)
lib/lp/buildmaster/interfaces/builder.py (+22/-0)
lib/lp/buildmaster/model/builder.py (+19/-1)
lib/lp/buildmaster/tests/test_builder.py (+14/-0)
lib/lp/soyuz/stories/webservice/xx-builders.txt (+3/-0)
To merge this branch: bzr merge lp:~wgrant/launchpad/ppa-reset-2.0-model
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+223396@code.launchpad.net

Commit message

Basic model code for the new virtual builder reset protocol columns.

Description of the change

Basic model code for the new virtual builder reset protocol columns added in https://code.launchpad.net/~wgrant/launchpad/ppa-reset-2.0-db/+merge/223395.

The only logic is to set date_clean_status_changed when clean_status changes, and to force clean_status to dirty when a builder is enabled.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/buildmaster/enums.py'
2--- lib/lp/buildmaster/enums.py 2013-10-31 07:30:54 +0000
3+++ lib/lp/buildmaster/enums.py 2014-06-17 13:01:08 +0000
4@@ -6,6 +6,8 @@
5 __metaclass__ = type
6
7 __all__ = [
8+ 'BuilderCleanStatus',
9+ 'BuilderResetProtocol',
10 'BuildStatus',
11 'BuildQueueStatus',
12 'BuildFarmJobType',
13@@ -183,3 +185,33 @@
14
15 The job is suspended, so should not be run.
16 """)
17+
18+
19+class BuilderCleanStatus(DBEnumeratedType):
20+
21+ CLEAN = DBItem(0, """
22+ Clean
23+
24+ The builder slave is ready for use.
25+ """)
26+
27+ DIRTY = DBItem(1, """
28+ Dirty
29+
30+ The builder slave is dirty and needs to be cleaned before use.
31+ """)
32+
33+ CLEANING = DBItem(2, """
34+ Cleaning
35+
36+ The builder slave is being cleaned.
37+ """)
38+
39+
40+class BuilderResetProtocol(DBEnumeratedType):
41+
42+ PROTO_1_1 = DBItem(11, """
43+ 1.1
44+
45+ Original synchronous protocol with vm_host and buildd_name.
46+ """)
47
48=== modified file 'lib/lp/buildmaster/interfaces/builder.py'
49--- lib/lp/buildmaster/interfaces/builder.py 2014-04-23 10:50:06 +0000
50+++ lib/lp/buildmaster/interfaces/builder.py 2014-06-17 13:01:08 +0000
51@@ -40,6 +40,8 @@
52 )
53 from zope.schema import (
54 Bool,
55+ Choice,
56+ Datetime,
57 Int,
58 List,
59 Text,
60@@ -49,6 +51,10 @@
61 from lp import _
62 from lp.app.validators.name import name_validator
63 from lp.app.validators.url import builder_url_validator
64+from lp.buildmaster.enums import (
65+ BuilderCleanStatus,
66+ BuilderResetProtocol,
67+ )
68 from lp.registry.interfaces.role import IHasOwner
69 from lp.services.fields import (
70 PersonChoice,
71@@ -181,6 +187,22 @@
72 title=_('Version'), required=False,
73 description=_('The version of launchpad-buildd on the slave.')))
74
75+ clean_status = exported(Choice(
76+ title=_("Clean status"), vocabulary=BuilderCleanStatus, readonly=True,
77+ description=_("The readiness of the slave to take a job.")))
78+
79+ date_clean_status_changed = exported(Datetime(
80+ title=_("Date clean status changed"), readonly=True,
81+ description=_("The date the builder's clean status last changed.")))
82+
83+ vm_reset_protocol = exported(Choice(
84+ title=_("VM reset protocol"), vocabulary=BuilderResetProtocol,
85+ readonly=False,
86+ description=_("The protocol version for resetting the VM.")))
87+
88+ def setCleanStatus(status):
89+ """Update the clean status."""
90+
91 def gotFailure():
92 """Increment failure_count on the builder."""
93
94
95=== modified file 'lib/lp/buildmaster/model/builder.py'
96--- lib/lp/buildmaster/model/builder.py 2013-11-28 09:12:45 +0000
97+++ lib/lp/buildmaster/model/builder.py 2014-06-17 13:01:08 +0000
98@@ -32,7 +32,11 @@
99 from zope.security.proxy import removeSecurityProxy
100
101 from lp.app.errors import NotFoundError
102-from lp.buildmaster.enums import BuildQueueStatus
103+from lp.buildmaster.enums import (
104+ BuilderCleanStatus,
105+ BuilderResetProtocol,
106+ BuildQueueStatus,
107+ )
108 from lp.buildmaster.interfaces.builder import (
109 IBuilder,
110 IBuilderSet,
111@@ -45,7 +49,10 @@
112 )
113 from lp.registry.interfaces.person import validate_public_person
114 from lp.services.database.bulk import load
115+from lp.services.database.constants import UTC_NOW
116+from lp.services.database.datetimecol import UtcDateTimeCol
117 from lp.services.database.decoratedresultset import DecoratedResultSet
118+from lp.services.database.enumcol import EnumCol
119 from lp.services.database.interfaces import (
120 ISlaveStore,
121 IStore,
122@@ -92,6 +99,10 @@
123 active = BoolCol(dbName='active', notNull=True, default=True)
124 failure_count = IntCol(dbName='failure_count', default=0, notNull=True)
125 version = StringCol(dbName='version')
126+ clean_status = EnumCol(
127+ enum=BuilderCleanStatus, default=BuilderCleanStatus.DIRTY)
128+ vm_reset_protocol = EnumCol(enum=BuilderResetProtocol)
129+ date_clean_status_changed = UtcDateTimeCol()
130
131 # The number of times a builder can consecutively fail before we
132 # reset its current job.
133@@ -113,6 +124,7 @@
134 self._builderok = value
135 if value is True:
136 self.resetFailureCount()
137+ self.setCleanStatus(BuilderCleanStatus.DIRTY)
138
139 builderok = property(_getBuilderok, _setBuilderok)
140
141@@ -173,6 +185,12 @@
142 """See IBuilder"""
143 return getUtility(IBuildQueueSet).getByBuilder(self)
144
145+ def setCleanStatus(self, status):
146+ """See `IBuilder`."""
147+ if status != self.clean_status:
148+ self.clean_status = status
149+ self.date_clean_status_changed = UTC_NOW
150+
151 def failBuilder(self, reason):
152 """See IBuilder"""
153 # XXX cprov 2007-04-17: ideally we should be able to notify the
154
155=== modified file 'lib/lp/buildmaster/tests/test_builder.py'
156--- lib/lp/buildmaster/tests/test_builder.py 2013-11-28 12:23:01 +0000
157+++ lib/lp/buildmaster/tests/test_builder.py 2014-06-17 13:01:08 +0000
158@@ -7,6 +7,7 @@
159 from zope.security.proxy import removeSecurityProxy
160
161 from lp.buildmaster.enums import (
162+ BuilderCleanStatus,
163 BuildQueueStatus,
164 BuildStatus,
165 )
166@@ -60,6 +61,19 @@
167 builder.builderok = True
168 self.assertEqual(0, builder.failure_count)
169
170+ def test_setting_builderok_dirties(self):
171+ builder = removeSecurityProxy(self.factory.makeBuilder())
172+ builder.builderok = False
173+ builder.setCleanStatus(BuilderCleanStatus.CLEAN)
174+ builder.builderok = True
175+ self.assertEqual(BuilderCleanStatus.DIRTY, builder.clean_status)
176+
177+ def test_setCleanStatus(self):
178+ builder = self.factory.makeBuilder()
179+ self.assertEqual(BuilderCleanStatus.DIRTY, builder.clean_status)
180+ builder.setCleanStatus(BuilderCleanStatus.CLEAN)
181+ self.assertEqual(BuilderCleanStatus.CLEAN, builder.clean_status)
182+
183 def test_handleFailure_increments_failure_count(self):
184 builder = self.factory.makeBuilder()
185 self.assertEqual(0, builder.failure_count)
186
187=== modified file 'lib/lp/soyuz/stories/webservice/xx-builders.txt'
188--- lib/lp/soyuz/stories/webservice/xx-builders.txt 2013-11-28 06:46:11 +0000
189+++ lib/lp/soyuz/stories/webservice/xx-builders.txt 2014-06-17 13:01:08 +0000
190@@ -29,6 +29,8 @@
191 ...
192 active
193 builderok
194+ clean_status
195+ date_clean_status_changed
196 failnotes
197 failure_count
198 manual
199@@ -39,6 +41,7 @@
200 version
201 virtualized
202 vm_host
203+ vm_reset_protocol
204
205
206 Changing builder properties