]> git.ipfire.org Git - pbs.git/commitdiff
repos: Implement relaunching jobs in sibling repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 24 May 2023 17:22:47 +0000 (17:22 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 24 May 2023 17:22:47 +0000 (17:22 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/config.py
src/buildservice/repository.py

index 1dc574317f0b07b252a109537bc7ceee40844abe..794b4b88eedc828f0918f608313a3212d83dc0fc 100644 (file)
@@ -70,7 +70,7 @@ class PakfireConfig(base.Object):
                self.repos.add(repo)
 
                # Add any sibling repositories
-               self.repos.update(repo.siblings)
+               self.repos.update(repo.parents)
 
        # Context
 
index 1d60956c98393bf0a7c556b7522a22239c5c50a1..13531aa2bb466850d58312267060bfb968f47f50 100644 (file)
@@ -27,17 +27,11 @@ KEY_LIFETIME      = datetime.timedelta(days=365)
 KEY_ROLLOVER_TIME = datetime.timedelta(days=60)
 
 class Repositories(base.Object):
-       def _get_repository(self, query, *args):
-               res = self.db.get(query, *args)
+       def _get_repositories(self, query, *args, **kwargs):
+               return self.db.fetch_many(Repository, query, *args, **kwargs)
 
-               if res:
-                       return Repository(self.backend, res.id, data=res)
-
-       def _get_repositories(self, query, *args):
-               res = self.db.query(query, *args)
-
-               for row in res:
-                       yield Repository(self.backend, row.id, data=row)
+       def _get_repository(self, query, *args, **kwargs):
+               return self.db.fetch_one(Repository, query, *args, **kwargs)
 
        def __iter__(self):
                repositories = self._get_repositories("SELECT * FROM repositories \
@@ -167,6 +161,23 @@ class Repository(base.DataObject):
        def distro(self):
                return self.backend.distros.get_by_id(self.data.distro_id)
 
+       # Repo Types
+
+       def is_user(self):
+               """
+                       Returns True if this is a user repository
+               """
+               if self.owner:
+                       return True
+
+               return False
+
+       def is_distro(self):
+               """
+                       Returns True if this is a distro repository
+               """
+               return not self.is_user()
+
        # Priority
 
        def get_priority(self):
@@ -414,9 +425,47 @@ class Repository(base.DataObject):
        # Sibling repositories
 
        @property
-       def siblings(self):
-               # XXX TODO
-               return []
+       def parents(self):
+               """
+                       Returns all parent repositories
+               """
+               # User repositories have the distro repositories as parents
+               if self.is_user():
+                       return self.distro.repos
+
+               # Distro repositories don't have any parents
+               elif self.is_distro():
+                       return []
+
+       @property
+       def children(self):
+               """
+                       Returns all repositories that depend on this
+               """
+               # User repositories don't have any children
+               if self.is_user():
+                       return []
+
+               # Distro repositories are parents for all user repositories
+               elif self.is_distro():
+                       return self.backend.repos._get_repositories("""
+                               SELECT
+                                       *
+                               FROM
+                                       repositories
+                               WHERE
+                                       deleted_at IS NULL
+                               AND
+                                       distro_id = %s
+                               AND
+                                       owner_id IS NOT NULL
+                               ORDER BY
+                                       created_at
+                               """, self.distro,
+
+                               # Cache
+                               distro=self.distro,
+                       )
 
        # Add/Remove Builds
 
@@ -889,25 +938,31 @@ class Repository(base.DataObject):
                if self.has_changed.is_set():
                        await self.update()
 
+               log.info("Finished updating %s" % self)
+
                # Relaunch any pending jobs
                await self.relaunch_pending_jobs()
 
        async def relaunch_pending_jobs(self):
+               """
+                       Relaunches all pending jobs
+               """
                # Perform this on this repository
-               self._relaunch_pending_jobs()
+               await self._relaunch_pending_jobs()
 
-               # Perform this for all sibling repositories
-               # XXX
-               #for repo in self.siblings:
-               #       repo._relaunch_pending_jobs()
+               # Perform this for all child repositories
+               for repo in self.children:
+                       await repo._relaunch_pending_jobs()
 
-       def _relaunch_pending_jobs(self):
+       async def _relaunch_pending_jobs(self):
                """
                        This function needs to be called whenever the repository has to be
-                       changed so that all pending jobs will have their dependencies recalculated.
+                       changed so that all pending jobs will have their dependencies re-checked.
                """
-               # Perform dependency checks on all pending jobs
-               self.backend.run_task(self.backend.jobs.launch, self.pending_jobs)
+               log.debug("%s: Relaunching pending jobs" % self)
+
+               # Try to relaunch all pending jobs
+               await self.backend.jobs.launch(self.pending_jobs)
 
        # Write repository