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
=== modified file 'lib/lp/buildmaster/enums.py'
--- lib/lp/buildmaster/enums.py 2013-10-31 07:30:54 +0000
+++ lib/lp/buildmaster/enums.py 2014-06-17 13:01:08 +0000
@@ -6,6 +6,8 @@
6__metaclass__ = type6__metaclass__ = type
77
8__all__ = [8__all__ = [
9 'BuilderCleanStatus',
10 'BuilderResetProtocol',
9 'BuildStatus',11 'BuildStatus',
10 'BuildQueueStatus',12 'BuildQueueStatus',
11 'BuildFarmJobType',13 'BuildFarmJobType',
@@ -183,3 +185,33 @@
183185
184 The job is suspended, so should not be run.186 The job is suspended, so should not be run.
185 """)187 """)
188
189
190class BuilderCleanStatus(DBEnumeratedType):
191
192 CLEAN = DBItem(0, """
193 Clean
194
195 The builder slave is ready for use.
196 """)
197
198 DIRTY = DBItem(1, """
199 Dirty
200
201 The builder slave is dirty and needs to be cleaned before use.
202 """)
203
204 CLEANING = DBItem(2, """
205 Cleaning
206
207 The builder slave is being cleaned.
208 """)
209
210
211class BuilderResetProtocol(DBEnumeratedType):
212
213 PROTO_1_1 = DBItem(11, """
214 1.1
215
216 Original synchronous protocol with vm_host and buildd_name.
217 """)
186218
=== modified file 'lib/lp/buildmaster/interfaces/builder.py'
--- lib/lp/buildmaster/interfaces/builder.py 2014-04-23 10:50:06 +0000
+++ lib/lp/buildmaster/interfaces/builder.py 2014-06-17 13:01:08 +0000
@@ -40,6 +40,8 @@
40 )40 )
41from zope.schema import (41from zope.schema import (
42 Bool,42 Bool,
43 Choice,
44 Datetime,
43 Int,45 Int,
44 List,46 List,
45 Text,47 Text,
@@ -49,6 +51,10 @@
49from lp import _51from lp import _
50from lp.app.validators.name import name_validator52from lp.app.validators.name import name_validator
51from lp.app.validators.url import builder_url_validator53from lp.app.validators.url import builder_url_validator
54from lp.buildmaster.enums import (
55 BuilderCleanStatus,
56 BuilderResetProtocol,
57 )
52from lp.registry.interfaces.role import IHasOwner58from lp.registry.interfaces.role import IHasOwner
53from lp.services.fields import (59from lp.services.fields import (
54 PersonChoice,60 PersonChoice,
@@ -181,6 +187,22 @@
181 title=_('Version'), required=False,187 title=_('Version'), required=False,
182 description=_('The version of launchpad-buildd on the slave.')))188 description=_('The version of launchpad-buildd on the slave.')))
183189
190 clean_status = exported(Choice(
191 title=_("Clean status"), vocabulary=BuilderCleanStatus, readonly=True,
192 description=_("The readiness of the slave to take a job.")))
193
194 date_clean_status_changed = exported(Datetime(
195 title=_("Date clean status changed"), readonly=True,
196 description=_("The date the builder's clean status last changed.")))
197
198 vm_reset_protocol = exported(Choice(
199 title=_("VM reset protocol"), vocabulary=BuilderResetProtocol,
200 readonly=False,
201 description=_("The protocol version for resetting the VM.")))
202
203 def setCleanStatus(status):
204 """Update the clean status."""
205
184 def gotFailure():206 def gotFailure():
185 """Increment failure_count on the builder."""207 """Increment failure_count on the builder."""
186208
187209
=== modified file 'lib/lp/buildmaster/model/builder.py'
--- lib/lp/buildmaster/model/builder.py 2013-11-28 09:12:45 +0000
+++ lib/lp/buildmaster/model/builder.py 2014-06-17 13:01:08 +0000
@@ -32,7 +32,11 @@
32from zope.security.proxy import removeSecurityProxy32from zope.security.proxy import removeSecurityProxy
3333
34from lp.app.errors import NotFoundError34from lp.app.errors import NotFoundError
35from lp.buildmaster.enums import BuildQueueStatus35from lp.buildmaster.enums import (
36 BuilderCleanStatus,
37 BuilderResetProtocol,
38 BuildQueueStatus,
39 )
36from lp.buildmaster.interfaces.builder import (40from lp.buildmaster.interfaces.builder import (
37 IBuilder,41 IBuilder,
38 IBuilderSet,42 IBuilderSet,
@@ -45,7 +49,10 @@
45 )49 )
46from lp.registry.interfaces.person import validate_public_person50from lp.registry.interfaces.person import validate_public_person
47from lp.services.database.bulk import load51from lp.services.database.bulk import load
52from lp.services.database.constants import UTC_NOW
53from lp.services.database.datetimecol import UtcDateTimeCol
48from lp.services.database.decoratedresultset import DecoratedResultSet54from lp.services.database.decoratedresultset import DecoratedResultSet
55from lp.services.database.enumcol import EnumCol
49from lp.services.database.interfaces import (56from lp.services.database.interfaces import (
50 ISlaveStore,57 ISlaveStore,
51 IStore,58 IStore,
@@ -92,6 +99,10 @@
92 active = BoolCol(dbName='active', notNull=True, default=True)99 active = BoolCol(dbName='active', notNull=True, default=True)
93 failure_count = IntCol(dbName='failure_count', default=0, notNull=True)100 failure_count = IntCol(dbName='failure_count', default=0, notNull=True)
94 version = StringCol(dbName='version')101 version = StringCol(dbName='version')
102 clean_status = EnumCol(
103 enum=BuilderCleanStatus, default=BuilderCleanStatus.DIRTY)
104 vm_reset_protocol = EnumCol(enum=BuilderResetProtocol)
105 date_clean_status_changed = UtcDateTimeCol()
95106
96 # The number of times a builder can consecutively fail before we107 # The number of times a builder can consecutively fail before we
97 # reset its current job.108 # reset its current job.
@@ -113,6 +124,7 @@
113 self._builderok = value124 self._builderok = value
114 if value is True:125 if value is True:
115 self.resetFailureCount()126 self.resetFailureCount()
127 self.setCleanStatus(BuilderCleanStatus.DIRTY)
116128
117 builderok = property(_getBuilderok, _setBuilderok)129 builderok = property(_getBuilderok, _setBuilderok)
118130
@@ -173,6 +185,12 @@
173 """See IBuilder"""185 """See IBuilder"""
174 return getUtility(IBuildQueueSet).getByBuilder(self)186 return getUtility(IBuildQueueSet).getByBuilder(self)
175187
188 def setCleanStatus(self, status):
189 """See `IBuilder`."""
190 if status != self.clean_status:
191 self.clean_status = status
192 self.date_clean_status_changed = UTC_NOW
193
176 def failBuilder(self, reason):194 def failBuilder(self, reason):
177 """See IBuilder"""195 """See IBuilder"""
178 # XXX cprov 2007-04-17: ideally we should be able to notify the196 # XXX cprov 2007-04-17: ideally we should be able to notify the
179197
=== modified file 'lib/lp/buildmaster/tests/test_builder.py'
--- lib/lp/buildmaster/tests/test_builder.py 2013-11-28 12:23:01 +0000
+++ lib/lp/buildmaster/tests/test_builder.py 2014-06-17 13:01:08 +0000
@@ -7,6 +7,7 @@
7from zope.security.proxy import removeSecurityProxy7from zope.security.proxy import removeSecurityProxy
88
9from lp.buildmaster.enums import (9from lp.buildmaster.enums import (
10 BuilderCleanStatus,
10 BuildQueueStatus,11 BuildQueueStatus,
11 BuildStatus,12 BuildStatus,
12 )13 )
@@ -60,6 +61,19 @@
60 builder.builderok = True61 builder.builderok = True
61 self.assertEqual(0, builder.failure_count)62 self.assertEqual(0, builder.failure_count)
6263
64 def test_setting_builderok_dirties(self):
65 builder = removeSecurityProxy(self.factory.makeBuilder())
66 builder.builderok = False
67 builder.setCleanStatus(BuilderCleanStatus.CLEAN)
68 builder.builderok = True
69 self.assertEqual(BuilderCleanStatus.DIRTY, builder.clean_status)
70
71 def test_setCleanStatus(self):
72 builder = self.factory.makeBuilder()
73 self.assertEqual(BuilderCleanStatus.DIRTY, builder.clean_status)
74 builder.setCleanStatus(BuilderCleanStatus.CLEAN)
75 self.assertEqual(BuilderCleanStatus.CLEAN, builder.clean_status)
76
63 def test_handleFailure_increments_failure_count(self):77 def test_handleFailure_increments_failure_count(self):
64 builder = self.factory.makeBuilder()78 builder = self.factory.makeBuilder()
65 self.assertEqual(0, builder.failure_count)79 self.assertEqual(0, builder.failure_count)
6680
=== modified file 'lib/lp/soyuz/stories/webservice/xx-builders.txt'
--- lib/lp/soyuz/stories/webservice/xx-builders.txt 2013-11-28 06:46:11 +0000
+++ lib/lp/soyuz/stories/webservice/xx-builders.txt 2014-06-17 13:01:08 +0000
@@ -29,6 +29,8 @@
29 ...29 ...
30 active30 active
31 builderok31 builderok
32 clean_status
33 date_clean_status_changed
32 failnotes34 failnotes
33 failure_count35 failure_count
34 manual36 manual
@@ -39,6 +41,7 @@
39 version41 version
40 virtualized42 virtualized
41 vm_host43 vm_host
44 vm_reset_protocol
4245
4346
44Changing builder properties47Changing builder properties