diff options
author | Zuul <zuul@review.opendev.org> | 2022-12-13 15:07:49 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-12-13 15:07:49 +0000 |
commit | d14f1e920230d295a6f874b3440e9807a43e1d30 (patch) | |
tree | 50f8eba180b5daffcc4390a961f1f8dfa4d963cb /zuul | |
parent | 532c30469ffc1a1b35d812455fa8271b392915cd (diff) | |
parent | cb3cc6bd4b8a7f33bde81e8fb3088279afc03dfa (diff) | |
download | zuul-d14f1e920230d295a6f874b3440e9807a43e1d30.tar.gz |
Merge "Consider queue settings for topic dependencies"
Diffstat (limited to 'zuul')
-rw-r--r-- | zuul/driver/zuul/__init__.py | 6 | ||||
-rw-r--r-- | zuul/manager/__init__.py | 20 | ||||
-rw-r--r-- | zuul/manager/dependent.py | 20 | ||||
-rw-r--r-- | zuul/manager/independent.py | 8 | ||||
-rw-r--r-- | zuul/model.py | 14 | ||||
-rw-r--r-- | zuul/reporter/__init__.py | 4 |
6 files changed, 45 insertions, 27 deletions
diff --git a/zuul/driver/zuul/__init__.py b/zuul/driver/zuul/__init__.py index 6dd6ff1b9..5051f99e5 100644 --- a/zuul/driver/zuul/__init__.py +++ b/zuul/driver/zuul/__init__.py @@ -23,6 +23,7 @@ from zuul.driver.zuul.zuulmodel import ZuulTriggerEvent from zuul.driver.zuul import zuulmodel from zuul.driver.zuul import zuultrigger from zuul.lib.logutil import get_annotated_logger +from zuul.model import Change PARENT_CHANGE_ENQUEUED = 'parent-change-enqueued' PROJECT_CHANGE_MERGED = 'project-change-merged' @@ -121,7 +122,7 @@ class ZuulDriver(Driver, TriggerInterface): log = get_annotated_logger(self.log, event) log.debug("Checking for changes needing %s:" % change) - if not hasattr(change, 'needed_by_changes'): + if not isinstance(change, Change): log.debug(" %s does not support dependencies" % type(change)) return @@ -129,7 +130,8 @@ class ZuulDriver(Driver, TriggerInterface): # numbers of github installations. This can be improved later # with persistent storage of dependency information. needed_by_changes = set( - pipeline.manager.resolveChangeReferences(change.needed_by_changes)) + pipeline.manager.resolveChangeReferences( + change.getNeededByChanges())) for source in self.sched.connections.getSources(): log.debug(" Checking source: %s", source.connection.connection_name) diff --git a/zuul/manager/__init__.py b/zuul/manager/__init__.py index 538da2c10..c94899782 100644 --- a/zuul/manager/__init__.py +++ b/zuul/manager/__init__.py @@ -228,9 +228,16 @@ class PipelineManager(metaclass=ABCMeta): change = source.getChange(key) if change is None: self.log.error("Unable to resolve change from key %s", key) - if (isinstance(change, model.Change) - and change.commit_needs_changes is None): - self.updateCommitDependencies(change, None, event=None) + + if isinstance(change, model.Change): + update_commit_dependencies = ( + change.commit_needs_changes is None) + update_topic_dependencies = ( + change.topic_needs_changes is None + and self.useDependenciesByTopic(change.project)) + if (update_commit_dependencies + or update_topic_dependencies): + self.updateCommitDependencies(change, None, event=None) self._change_cache[change.cache_key] = change resolved_changes.append(change) return resolved_changes @@ -246,8 +253,9 @@ class PipelineManager(metaclass=ABCMeta): active_layout_uuids.add(item.layout_uuid) if isinstance(item.change, model.Change): - referenced_change_keys.update(item.change.needs_changes) - referenced_change_keys.update(item.change.needed_by_changes) + referenced_change_keys.update(item.change.getNeedsChanges( + self.useDependenciesByTopic(item.change.project))) + referenced_change_keys.update(item.change.getNeededByChanges()) # Clean up unused layouts in the cache unused_layouts = set(self._layout_cache.keys()) - active_layout_uuids @@ -574,7 +582,7 @@ class PipelineManager(metaclass=ABCMeta): return True cycle = [] - if hasattr(change, "needs_changes"): + if isinstance(change, model.Change): cycle = self.cycleForChange(change, dependency_graph, event) if cycle and not self.canProcessCycle(change.project): log.info("Dequeing change %s since at least one project " diff --git a/zuul/manager/dependent.py b/zuul/manager/dependent.py index f84f52dad..4af541dfd 100644 --- a/zuul/manager/dependent.py +++ b/zuul/manager/dependent.py @@ -80,7 +80,7 @@ class DependentPipelineManager(SharedQueuePipelineManager): history = history if history is not None else [] log.debug("Checking for changes needing %s:" % change) - if not hasattr(change, 'needed_by_changes'): + if not isinstance(change, model.Change): log.debug(" %s does not support dependencies" % type(change)) return @@ -90,7 +90,7 @@ class DependentPipelineManager(SharedQueuePipelineManager): sources = {p.source for p in projects} needed_by_changes = self.resolveChangeReferences( - change.needed_by_changes) + change.getNeededByChanges()) log.debug(" Previously known following changes: %s", needed_by_changes) seen = set(needed_by_changes) @@ -184,10 +184,11 @@ class DependentPipelineManager(SharedQueuePipelineManager): # Return true if okay to proceed enqueing this change, # false if the change should not be enqueued. log.debug("Checking for changes needed by %s:" % change) - if not hasattr(change, 'needs_changes'): + if not isinstance(change, model.Change): log.debug(" %s does not support dependencies", type(change)) return False, [] - if not change.needs_changes: + if not change.getNeedsChanges( + self.useDependenciesByTopic(change.project)): log.debug(" No changes needed") return False, [] changes_needed = [] @@ -195,7 +196,8 @@ class DependentPipelineManager(SharedQueuePipelineManager): # Ignore supplied change_queue with self.getChangeQueue(change, event) as change_queue: for needed_change in self.resolveChangeReferences( - change.needs_changes): + change.getNeedsChanges( + self.useDependenciesByTopic(change.project))): log.debug(" Change %s needs change %s:" % ( change, needed_change)) if needed_change.is_merged: @@ -245,13 +247,15 @@ class DependentPipelineManager(SharedQueuePipelineManager): return abort, changes_needed def getFailingDependentItems(self, item, nnfi): - if not hasattr(item.change, 'needs_changes'): + if not isinstance(item.change, model.Change): return None - if not item.change.needs_changes: + if not item.change.getNeedsChanges( + self.useDependenciesByTopic(item.change.project)): return None failing_items = set() for needed_change in self.resolveChangeReferences( - item.change.needs_changes): + item.change.getNeedsChanges( + self.useDependenciesByTopic(item.change.project))): needed_item = self.getItemForChange(needed_change) if not needed_item: continue diff --git a/zuul/manager/independent.py b/zuul/manager/independent.py index b70e9184b..aeeff5adc 100644 --- a/zuul/manager/independent.py +++ b/zuul/manager/independent.py @@ -82,16 +82,18 @@ class IndependentPipelineManager(PipelineManager): log.debug("Checking for changes needed by %s:" % change) # Return true if okay to proceed enqueing this change, # false if the change should not be enqueued. - if not hasattr(change, 'needs_changes'): + if not isinstance(change, model.Change): log.debug(" %s does not support dependencies" % type(change)) return False, [] - if not change.needs_changes: + if not change.getNeedsChanges( + self.useDependenciesByTopic(change.project)): log.debug(" No changes needed") return False, [] changes_needed = [] abort = False for needed_change in self.resolveChangeReferences( - change.needs_changes): + change.getNeedsChanges( + self.useDependenciesByTopic(change.project))): log.debug(" Change %s needs change %s:" % ( change, needed_change)) if needed_change.is_merged: diff --git a/zuul/model.py b/zuul/model.py index c2da4f65c..3658a0289 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -6162,18 +6162,17 @@ class Change(Branch): return True return False - @property - def needs_changes(self): + def getNeedsChanges(self, include_topic_needs=False): commit_needs_changes = self.commit_needs_changes or [] - topic_needs_changes = self.topic_needs_changes or [] + topic_needs_changes = ( + include_topic_needs and self.topic_needs_changes) or [] r = OrderedDict() for x in (self.git_needs_changes + self.compat_needs_changes + commit_needs_changes + topic_needs_changes): r[x] = None return tuple(r.keys()) - @property - def needed_by_changes(self): + def getNeededByChanges(self): r = OrderedDict() for x in (self.git_needed_by_changes + self.compat_needed_by_changes): r[x] = None @@ -6197,8 +6196,9 @@ class Change(Branch): so far. Will be updated with additional changes by this method. """ related.add(self.cache_stat.key) - for reference in itertools.chain(self.needs_changes, - self.needed_by_changes): + for reference in itertools.chain( + self.getNeedsChanges(include_topic_needs=True), + self.getNeededByChanges()): key = ChangeKey.fromReference(reference) if key not in related: source = sched.connections.getSource(key.connection_name) diff --git a/zuul/reporter/__init__.py b/zuul/reporter/__init__.py index 9a868eac4..090bbfbb8 100644 --- a/zuul/reporter/__init__.py +++ b/zuul/reporter/__init__.py @@ -261,7 +261,9 @@ class BaseReporter(object, metaclass=abc.ABCMeta): def _formatItemReportOtherBundleItems(self, item): related_changes = item.pipeline.manager.resolveChangeReferences( - item.change.needs_changes) + item.change.getNeedsChanges( + item.pipeline.manager.useDependenciesByTopic( + item.change.project))) return "Related changes:\n{}\n".format("\n".join( f' - {c.url}' for c in related_changes if c is not item.change)) |