Cause the promote command to ignore pipeline reqs

Because adding a change to a pipeline may, as a side effect, cause
the requirements for that pipeline not to be satisfied, ignore
pipeline requirements when changes are being promoted.  In this
case we are essentially trusting that the requirements were
satisfied during the initial enqueing and so should not be checked
again.

Change-Id: Ic86f3fb881ccd802a62a8f2f0cfb3ea5cccccb7b
This commit is contained in:
James E. Blair 2014-07-10 13:12:07 -07:00
parent 9aa26bf556
commit f9ab884547
1 changed files with 20 additions and 15 deletions

View File

@ -688,7 +688,8 @@ class Scheduler(threading.Thread):
pipeline.manager.addChange(
item.change,
enqueue_time=item.enqueue_time,
quiet=True)
quiet=True,
ignore_requirements=True)
def _areAllBuildsComplete(self):
self.log.debug("Checking if all builds are complete")
@ -1020,10 +1021,10 @@ class BasePipelineManager(object):
def isChangeReadyToBeEnqueued(self, change):
return True
def enqueueChangesAhead(self, change, quiet):
def enqueueChangesAhead(self, change, quiet, ignore_requirements):
return True
def enqueueChangesBehind(self, change, quiet):
def enqueueChangesBehind(self, change, quiet, ignore_requirements):
return True
def checkForChangesNeededBy(self, change):
@ -1081,7 +1082,8 @@ class BasePipelineManager(object):
item.change.project)
return False
def addChange(self, change, quiet=False, enqueue_time=None):
def addChange(self, change, quiet=False, enqueue_time=None,
ignore_requirements=False):
self.log.debug("Considering adding change %s" % change)
if self.isChangeAlreadyInQueue(change):
self.log.debug("Change %s is already in queue, ignoring" % change)
@ -1092,13 +1094,14 @@ class BasePipelineManager(object):
change)
return False
for f in self.changeish_filters:
if not f.matches(change):
self.log.debug("Change %s does not match pipeline "
"requirement %s" % (change, f))
return False
if not ignore_requirements:
for f in self.changeish_filters:
if not f.matches(change):
self.log.debug("Change %s does not match pipeline "
"requirement %s" % (change, f))
return False
if not self.enqueueChangesAhead(change, quiet):
if not self.enqueueChangesAhead(change, quiet, ignore_requirements):
self.log.debug("Failed to enqueue changes ahead of %s" % change)
return False
@ -1117,7 +1120,7 @@ class BasePipelineManager(object):
if enqueue_time:
item.enqueue_time = enqueue_time
self.reportStats(item)
self.enqueueChangesBehind(change, quiet)
self.enqueueChangesBehind(change, quiet, ignore_requirements)
else:
self.log.error("Unable to find change queue for project %s" %
change.project)
@ -1708,7 +1711,7 @@ class DependentPipelineManager(BasePipelineManager):
return False
return True
def enqueueChangesBehind(self, change, quiet):
def enqueueChangesBehind(self, change, quiet, ignore_requirements):
to_enqueue = []
self.log.debug("Checking for changes needing %s:" % change)
if not hasattr(change, 'needed_by_changes'):
@ -1724,15 +1727,17 @@ class DependentPipelineManager(BasePipelineManager):
self.log.debug(" No changes need %s" % change)
for other_change in to_enqueue:
self.addChange(other_change, quiet)
self.addChange(other_change, quiet=quiet,
ignore_requirements=ignore_requirements)
def enqueueChangesAhead(self, change, quiet):
def enqueueChangesAhead(self, change, quiet, ignore_requirements):
ret = self.checkForChangesNeededBy(change)
if ret in [True, False]:
return ret
self.log.debug(" Change %s must be merged ahead of %s" %
(ret, change))
return self.addChange(ret, quiet)
return self.addChange(ret, quiet=quiet,
ignore_requirements=ignore_requirements)
def checkForChangesNeededBy(self, change):
self.log.debug("Checking for changes needed by %s:" % change)