Commit Graph

21 Commits (bbaf222aa499f4ac1e949e334a1c5b1b2ccce490)

Author SHA1 Message Date
Tobias Henkel eca4620efa Optionally limit github to protected branches
When using a branch and pull model on a shared repository there are
usually one or more protected branches which are gated and a dynamic
number of temporary personal/feature branches which are the source for
the pull requests. These temporary branches while ungated can
potentially include broken zuul config and therefore break the global
tenant wide configuration.

In order to deal with this model add support for excluding unprotected
branches. This can be configured on tenant level and overridden per

Change-Id: I8a45fd41539a3c964a84142f04c1644585c0fdcf
6 years ago
Monty Taylor b934c1a052
Remove use of six library
It exists only for py2/py3 compat. We do not need it any more.

This will explicitly break Zuul v3 for python2, which is different than
simply ceasing to test it and no longer declaring we support it. Since
we're not testing it any longer, it's bound to degrade overtime without
us noticing, so hopefully a clean and explicit break will prevent people
from running under python2 and it working for a minute, then breaking

Change-Id: Ia16bb399a2869ab37a183f3f2197275bb3acafee
6 years ago
James E. Blair aad3ae2fe1 Add driver-specific pipeline requirements
As we expand the Github driver, we're seeing a need to specify driver-specific
pipeline requirements.  To accomplish this, bump the require/reject pipeline
keywords down a level underneath connection names.  This lets users specify
per-source pipeline requirements.

This adds new API methods for sources to create the new pipeline filters
(by returning instances or subclasses of RefFilter, which used to be called

This change also creates and/or moves driver-specific subclasses of EventFilter
and TriggerEvent in(to) their respective drivers.

Change-Id: Ia56c254e3aa591a688103db5b04b3dddae7b2da4
6 years ago
James E. Blair 1c7744207c Add canonical hostname to source object
This is the start of the implementation of:

It lets us associate a canonical hostname with every connection
that we will later use to uniquely identify source code repos.

Story: 2000953
Change-Id: I7f2e64944d46f304e63a54078e682fd5e1682f27
6 years ago
James E. Blair f43b53a67f Fix constructor arguments to source
Instatiations of sources all passed (driver, connection) to the
constructor, which was expecting (config, connection).  The
config option is currently ignored (sources currently have no
additional configuration), which is why we didn't notice the

Update the constructor to (driver, connection, optional config)
to match the rest of the driver-related classes.

Change-Id: Ibc878b51b81950559d39b00b1591864c7661fe7c
6 years ago
James E. Blair e511d2f6c4 Reorganize connections into drivers
This change, while substantial, is mostly organizational.
Currently, connections, sources, triggers, and reporters are
discrete concepts, and yet are related by virtue of the fact that
the ConnectionRegistry is used to instantiate each of them.  The
method used to instantiate them is called "_getDriver", in
recognition that behind each "trigger", etc., which appears in
the config file, there is a class in the zuul.trigger hierarchy
implementing the driver for that trigger.  Connections also
specify a "driver" in the config file.

In this change, we redefine a "driver" as a single class that
organizes related connections, sources, triggers and reporters.

The connection, source, trigger, and reporter interfaces still
exist.  A driver class is responsible for indicating which of
those interfaces it supports and instantiating them when asked to
do so.

Zuul instantiates a single instance of each driver class it knows
about (currently hardcoded, but in the future, we will be able to
easily ask entrypoints for these).  That instance will be
retained for the life of the Zuul server process.

When Zuul is (re-)configured, it asks the driver instances to
create new connection, source, trigger, reporter instances as
necessary.  For instance, a user may specify a connection that
uses the "gerrit" driver, and the ConnectionRegistry would call
getConnection() on the Gerrit driver instance.

This is done for two reasons: first, it allows us to organize all
of the code related to interfacing with an external system
together.  All of the existing connection, source, trigger, and
reporter classes are moved as follows:

  zuul.connection.FOO -> zuul.driver.FOO.FOOconnection
  zuul.source.FOO -> zuul.driver.FOO.FOOsource
  zuul.trigger.FOO -> zuul.driver.FOO.FOOtrigger
  zuul.reporter.FOO -> zuul.driver.FOO.FOOreporter

For instance, all of the code related to interfacing with Gerrit
is now is zuul.driver.gerrit.

Second, the addition of a single, long-lived object associated
with each of these systems allows us to better support some types
of interfaces.  For instance, the Zuul trigger maintains a list
of events it is required to emit -- this list relates to a tenant
as a whole rather than individual pipelines or triggers.  The
timer trigger maintains a single scheduler instance for all
tenants, but must be able to add or remove cron jobs based on an
individual tenant being reconfigured.  The global driver instance
for each of these can be used to accomplish this.

As a result of using the driver interface to create new
connection, source, trigger and reporter instances, the
connection setup in ConnectionRegistry is much simpler, and can
easily be extended with entrypoints in the future.

The existing tests of connections, sources, triggers, and
reporters which only tested that they could be instantiated and
have names have been removed, as there are functional tests which
cover them.

Change-Id: Ib2f7297d81f7a003de48f799dc1b09e82d4894bc
6 years ago
Jenkins 86d2f726be Merge "Add getProjectBranches to Source" into feature/zuulv3 7 years ago
Paul Belanger 9bba490381 Re-enable test_can_merge unit test
Expose the ability to refresh a change in zuul/connection/
too, which is needed for our unit testing.

Change-Id: Iefd09d9b8deef563299e0f209d95e25b61aa4c1e
Signed-off-by: Paul Belanger <>
7 years ago
James E. Blair 51b7492e95 Add getProjectBranches to Source
This lets us ask a source for all of the branches for a project.
This uses the git protocol for now, but this can get much nicer
in the future if we switch to using Gerrit's REST API.  It should
also be easy to do with github.

The included comment indicates why it's being added -- implementation
to follow in subsequent changes.

Change-Id: I0dfcd61f343a235dcf935aea434b9772d6e746d9
7 years ago
James E. Blair fef7894c1b Remove scheduler parameter from connection registry
The connection registry should not have to know about the scheduler,
rather, the inverse is true.

(NB, connections themselves still know about the scheduler, but
that's okay, that happens after the connection registry is created.)

Drivers should be able to access the global configuration when
being created, so store that when the connection registry configures

Change-Id: Iea4b8fe3888b5eefd3df9ce385225b885f2caa0b
7 years ago
James E. Blair 765e11b657 Move gerrit logic from source to connection
Sources and connections are very tightly coupled in reality.  Rather
than trying to maintain them as two abstractions, consider the
connection to hold all of the information and logic about the reality
of the external resource it represents.  Make sources mere local
data structures that are used to interface a connection with a pipeline.

As seen in subsequent changes, this will allow us to simplify the
interconnections between objects.

Change-Id: I2dd88e1165267e4f987a205ba55923eaec7ea9ce
7 years ago
Joshua Hesketh dc7820cf88 Merge branch 'master' into feature/zuulv3

Change-Id: I2973bfae65b3658549dc13aa3ea0efe60669ba8e
7 years ago
Joshua Hesketh 4bd7da32fa Cache is held and managed by connections
Add reconfigure test case. This test previously fails currently due to a
regression introduced with the connections changes.

Because multiple sources share a connection, a pipeline that does not hold
and therefore require any changes in the cache may clear a connections
cache before a pipeline that does need said change has an opportunity to
add it to the relevant list.

Allow connections to manage their cache directly rather than the source
doing it vicariously ignorant of other pipelines/sources. Collect the
relevant changes from all pipelines and ask any connections holding a
cache for that item to keep it on reconfiguration.

Co-Authored-By: James E. Blair <>
Change-Id: I2bf8ba6b9deda58114db9e9b96985a2a0e2a69cb
7 years ago
Joshua Hesketh 89b67f617c Merge master into feature/zuulv3

Change-Id: If1c8ac3bf26bd8c4496ac130958b966d9937519e
7 years ago
Joshua Hesketh 811e2e9334 Fix regression in change tracking
Make sure we update the referenced change object on a new gerrit
event rather than waiting to remake the queue item.

This was a performance regression in the connection changes.

Change-Id: I2a967f0347352a7674deb550e34fb94d1d903e89
8 years ago
James E. Blair 8300578a2a Add job inheritance and start refactoring
This begins a lot of related changes refactoring config loading,
the data model, etc., which will continue in subsequent changes.

Change-Id: I2ca52a079a837555c1f668e29d5a2fe0a80c1af5
8 years ago
James E. Blair 93bdde8551 Remove stop method from reporters, sources, triggers
It still remains in the drivers that the connections utilize.

Change-Id: Ie6efb57af297fbd546eed3e1104299b2e1a5205e
8 years ago
James E. Blair 59fdbac119 Add tenants
Change-Id: Ia6c21152c00c9380c17c559290ed98ff22cf767b
8 years ago
Joshua Hesketh 352264b3c2 Add support for 'connection' concept
This is a large refactor and as small as I could feasibly make it
while keeping the tests working. I'll do the documentation and
touch ups in the next commit to make digesting easier.

Change-Id: Iac5083996a183d1d8a9b6cb8f70836f7c39ee910
8 years ago
Joshua Hesketh ecdbd80247 Add base class for sources
and test the all sources adhere to the set contract.

Also standardise the source (triggers to come) class names
to NameSource.

This will make it easier to do more sources in the future and also
add the possibility of loading sources dynamically.

Co-Authored-By: Gregory Haynes <>

Change-Id: I15b32013904f60873601dd7cc8fce3c158787de4
8 years ago
Joshua Hesketh 850ccb6022 Refactor sources out of triggers
This is to further differentiate between sources and triggers.
Eventually allowing for multiple triggers per pipeline.

Still to come is separating connections from everything.

Change-Id: I1d680dbed5f650165643842af450f16b32ec5ed9
8 years ago