From: Michael Tremer Date: Fri, 12 May 2023 18:44:16 +0000 (+0000) Subject: builds: Add callbacks for build groups X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d114b98a9f0dcc7318fbd5c07e5b347bd4c203d2;p=pbs.git builds: Add callbacks for build groups Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/builds.py b/src/buildservice/builds.py index cb5c5089..c08a9c02 100644 --- a/src/buildservice/builds.py +++ b/src/buildservice/builds.py @@ -632,6 +632,8 @@ class Build(base.DataObject): """ Called when this build has successfully finished """ + builds = None + # Log this if success: log.info("Build %s has finished" % self) @@ -654,7 +656,13 @@ class Build(base.DataObject): # Create any test builds if success: - return await self.create_test_builds() + builds = await self.create_test_builds() + + # Notify the group that build has finished + if self.group: + await self.group._build_finished(self) + + return builds def has_finished(self): """ @@ -1081,6 +1089,12 @@ class Group(base.DataObject): def created_at(self): return self.data.created_at + # Finished At + + @property + def finished_at(self): + return self.data.finished_at + # Builds @lazy_property @@ -1148,22 +1162,77 @@ class Group(base.DataObject): def has_failed(self): """ - Returns True if at least one job has failed + Returns True if at least one build has failed """ - return any((b.has_failed() for b in self.builds)) + return self.failed is True def is_successful(self): """ Returns True if all jobs have been successful """ - return all((b.is_successful() for b in self.builds)) + return self.has_finished() and self.failed is False def has_finished(self): + """ + Returns True if all builds have finished + """ + if self.data.finished_at: + return True + + return False + + def all_finished(self): """ Returns True if all builds have finished """ return all((b.has_finished() for b in self.builds)) + def is_test(self): + """ + Returns True if this is a test group (i.e. all builds are test builds) + """ + return all((b.is_test() for b in self.builds)) + + async def _build_finished(self, build): + """ + Called when a build has finished + """ + # Fail this group if one build has failed + if build.has_failed(): + await self.failed() + + # Finished when all builds have finished + if self.all_finished(): + await self.finished() + + async def finished(self): + """ + Called when all builds in this group have finished + """ + # Only call once + if self.has_finished(): + return + + log.info("Build group %s has finished" % self) + + # Mark as finished + self._set_attribute_now("finished_at") + + # XXX call the build that that has created this group for test builds + + async def failed(self): + """ + Called when this group is considered failed + """ + # Do nothing if already failed + if self.has_failed(): + return + + log.error("Build group %s has failed" % self) + + # Mark as failed + self._set_attribute("failed", True) + class Comments(base.Object): def _get_comments(self, query, *args):