Include project name in gerrit branch cache

The structured cache data change updated the keys for the gerrit
branch cache, but it omitted the project from non-change items.

Gerrit change items omit the project because when we fetch gerrit
changes from the cache, we often only know the number.  However,
all other types of items (branches, tags, etc) are project specific,
and so their cache keys must contain the branch name.  Without it,
we may fetch the wrong change from the cache for timer pipelines.

The other drivers all require the project name for every change
type, including changes (since PR numbers are not unique), so they
were not affected by this copypasta error.

Change-Id: I399330cdf9880072580d3e70d97b63cb74d95a23
This commit is contained in:
James E. Blair 2021-09-28 15:15:37 -07:00
parent 29d0534696
commit 659ba07f63
9 changed files with 93 additions and 3 deletions

View File

@ -0,0 +1,2 @@
- hosts: all
tasks: []

View File

@ -0,0 +1,14 @@
- pipeline:
name: periodic
manager: independent
trigger:
timer:
- time: '* * * * * */1'
- job:
name: base
parent: null
run: playbooks/run.yaml
- job:
name: test-job

View File

@ -0,0 +1 @@
test

View File

@ -0,0 +1,4 @@
- project:
periodic:
jobs:
- test-job

View File

@ -0,0 +1 @@
test

View File

@ -0,0 +1,4 @@
- project:
periodic:
jobs:
- test-job

View File

@ -0,0 +1,21 @@
- tenant:
name: tenant-one
source:
gerrit:
config-projects:
- common-config
untrusted-projects:
- org/project1
- org/project2:
include: []
- tenant:
name: tenant-two
source:
gerrit:
config-projects:
- common-config
untrusted-projects:
- org/project1:
include: []
- org/project2

View File

@ -0,0 +1,43 @@
# Copyright 2021 Acme Gating, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tests.base import ZuulTestCase, iterate_timeout
class TestTimerTwoTenants(ZuulTestCase):
tenant_config_file = 'config/timer-two-tenant/main.yaml'
def test_timer_two_tenants(self):
# The pipeline triggers every second. Wait until we have 4
# jobs (2 from each tenant).
for _ in iterate_timeout(60, 'jobs started'):
if len(self.history) >= 4:
break
tenant_one_projects = set()
tenant_two_projects = set()
for h in self.history:
if h.parameters['zuul']['tenant'] == 'tenant-one':
tenant_one_projects.add((h.parameters['items'][0]['project']))
if h.parameters['zuul']['tenant'] == 'tenant-two':
tenant_two_projects.add((h.parameters['items'][0]['project']))
# Verify that the right job ran in the right tenant
self.assertEqual(tenant_one_projects, {'org/project1'})
self.assertEqual(tenant_two_projects, {'org/project2'})
# Stop running timer jobs so the assertions don't race.
self.commitConfigUpdate('common-config', 'layouts/no-timer.yaml')
self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
self.waitUntilSettled()

View File

@ -779,7 +779,7 @@ class GerritConnection(ZKChangeCacheMixin, BaseConnection):
def _getTag(self, event):
tag = event.ref[len('refs/tags/'):]
key = ChangeKey(self.connection_name, None,
key = ChangeKey(self.connection_name, event.project_name,
'Tag', tag, event.newrev)
change = self._change_cache.get(key)
if change:
@ -798,7 +798,7 @@ class GerritConnection(ZKChangeCacheMixin, BaseConnection):
return change
def _getBranch(self, event, branch, ref):
key = ChangeKey(self.connection_name, None,
key = ChangeKey(self.connection_name, event.project_name,
'Branch', branch, event.newrev)
change = self._change_cache.get(key)
if change:
@ -817,7 +817,7 @@ class GerritConnection(ZKChangeCacheMixin, BaseConnection):
return change
def _getRef(self, event):
key = ChangeKey(self.connection_name, None,
key = ChangeKey(self.connection_name, event.project_name,
'Ref', event.ref, event.newrev)
change = self._change_cache.get(key)
if change: