With the Zuul upgrade earlier today ( 2.0.0-327-g3ebedde-wmf2precise1 ) , changes which are Verified:+1 no more enter gate-and-submit.
The workaround is to vote Verified+2 and CR+2 which let Zuul accept the patch.
I think the root cause is when I changed the label to be upper case with: https://gerrit.wikimedia.org/r/#/c/226220/1/zuul/layout.yaml . That unbroke a feature that never worked previously which is that Zuul looks at the change submit record to verify whether a patch can actually be merged. If not, Zuul does not bother entering the change in the pipeline.
An example for a job having Verified: +1 (edited):
```
gerrit query 223572 --submit-records
change I265913dcb28a09b2ba803a226ee03b96fc543ab9
project: mediawiki/core
branch: master
url: https://gerrit.wikimedia.org/r/223572
open: true
status: NEW
submitRecords:
status: NOT_READY
labels:
label: Verified
status: NEED
labels:
label: Code-Review
status: NEED
```
The change is not ready because neither Verified nor Code-Review received the necessary votes. On OpenStack a change needs both to be set before the gate bother dealing with the change.
Potentially, when we had the lower case `verified` the status was being ignored somehow (have to test). Now that is upper case `Verified` and `Code-Review` Zuul behavior works as intended but ends up being a regression for us.
Maybe we can soften the approval in gate-and-submit to allow changes with Verified -1,0,+1,+2 to enter the gate. Have to be tested as well.
The relevant function is in integration/zuul.git branch `debian/precise-wikimedia` then: zuul/trigger/gerrit.py Gerrit.canMerge() . Pasting it here as a convenience:
```
lang=python
def canMerge(self, change, allow_needs):
if not change.number:
self.log.debug("Change has no number; considering it merged")
# Good question. It's probably ref-updated, which, ah,
# means it's merged.
return True
data = change._data
if not data:
return False
if 'submitRecords' not in data:
return False
try:
for sr in data['submitRecords']:
if sr['status'] == 'OK':
return True
elif sr['status'] == 'NOT_READY':
for label in sr['labels']:
if label['status'] == 'OK':
continue
elif label['status'] in ['NEED', 'REJECT']:
# It may be our own rejection, so we ignore
if label['label'].lower() not in allow_needs:
return False
continue
else:
# IMPOSSIBLE
return False
else:
# CLOSED, RULE_ERROR
return False
except:
self.log.exception("Exception determining whether change"
"%s can merge:" % change)
return False
return True
```
Should be easy to exercise in integration/config test suite.