diff mbox series

[07/12] prserv: add extra requests

Message ID 20240412090234.4110915-8-michael.opdenacker@bootlin.com
State Accepted, archived
Commit 0f1474a30f741b760ca81c19dd1d8f3bd5647251
Headers show
Series prserv: add support for an "upstream" server | expand

Commit Message

Michael Opdenacker April 12, 2024, 9:02 a.m. UTC
From: Michael Opdenacker <michael.opdenacker@bootlin.com>

Useful for connecting a PR server to an upstream one

- "test-package" checks whether the specified package
  version and arch is known in the database.

- "test-pr" checks a specified output hash is found in the database.
  Otherwise it returns 'None' instead of a new value.

- "max-package-pr" returns the highest PR number for
  (version, arch) entries in the database, and None if not found

Add new DB functions supporting the above, plus test_value()
which tells whether a given value is available for the specified
package and architecture.

Signed-off-by: Michael Opdenacker <michael.opdenacker@bootlin.com>
Cc: Joshua Watt <JPEWhacker@gmail.com>
Cc: Tim Orling <ticotimo@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
 lib/prserv/client.py | 23 +++++++++++++++++++++-
 lib/prserv/db.py     | 46 ++++++++++++++++++++++++++++++++++++++++++++
 lib/prserv/serv.py   | 28 +++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 1 deletion(-)

Comments

Bruce Ashfield April 17, 2024, 2:45 p.m. UTC | #1
On Fri, Apr 12, 2024 at 5:02 AM Michael Opdenacker via
lists.openembedded.org <michael.opdenacker=
bootlin.com@lists.openembedded.org> wrote:

> From: Michael Opdenacker <michael.opdenacker@bootlin.com>
>
> Useful for connecting a PR server to an upstream one
>
> - "test-package" checks whether the specified package
>   version and arch is known in the database.
>
> - "test-pr" checks a specified output hash is found in the database.
>   Otherwise it returns 'None' instead of a new value.
>
> - "max-package-pr" returns the highest PR number for
>   (version, arch) entries in the database, and None if not found
>
> Add new DB functions supporting the above, plus test_value()
> which tells whether a given value is available for the specified
> package and architecture.
>

I always bounce around in my own code on whether I prefer
the "action" or the "object" to be more prominent in my method
naming.

i.e. pr_get or get_pr

I tend to land on pr_get() -style most of the time.

That being said, your routines match up wth the existing style
so my comment is literally that .. commentary. And I have no
concerns with the change.

Reviewed-by: Bruce Ashfield <bruce.ashfield@gmail.com>



>
> Signed-off-by: Michael Opdenacker <michael.opdenacker@bootlin.com>
> Cc: Joshua Watt <JPEWhacker@gmail.com>
> Cc: Tim Orling <ticotimo@gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> ---
>  lib/prserv/client.py | 23 +++++++++++++++++++++-
>  lib/prserv/db.py     | 46 ++++++++++++++++++++++++++++++++++++++++++++
>  lib/prserv/serv.py   | 28 +++++++++++++++++++++++++++
>  3 files changed, 96 insertions(+), 1 deletion(-)
>
> diff --git a/lib/prserv/client.py b/lib/prserv/client.py
> index 7bc5188c53..8471ee3046 100644
> --- a/lib/prserv/client.py
> +++ b/lib/prserv/client.py
> @@ -20,6 +20,27 @@ class PRAsyncClient(bb.asyncrpc.AsyncClient):
>          if response:
>              return response["value"]
>
> +    async def test_pr(self, version, pkgarch, checksum):
> +        response = await self.invoke(
> +            {"test-pr": {"version": version, "pkgarch": pkgarch,
> "checksum": checksum}}
> +        )
> +        if response:
> +            return response["value"]
> +
> +    async def test_package(self, version, pkgarch):
> +        response = await self.invoke(
> +            {"test-package": {"version": version, "pkgarch": pkgarch}}
> +        )
> +        if response:
> +            return response["value"]
> +
> +    async def max_package_pr(self, version, pkgarch):
> +        response = await self.invoke(
> +            {"max-package-pr": {"version": version, "pkgarch": pkgarch}}
> +        )
> +        if response:
> +            return response["value"]
> +
>      async def importone(self, version, pkgarch, checksum, value):
>          response = await self.invoke(
>              {"import-one": {"version": version, "pkgarch": pkgarch,
> "checksum": checksum, "value": value}}
> @@ -44,7 +65,7 @@ class PRAsyncClient(bb.asyncrpc.AsyncClient):
>  class PRClient(bb.asyncrpc.Client):
>      def __init__(self):
>          super().__init__()
> -        self._add_methods("getPR", "importone", "export", "is_readonly")
> +        self._add_methods("getPR", "test_pr", "test_package",
> "importone", "export", "is_readonly")
>
>      def _get_async_client(self):
>          return PRAsyncClient()
> diff --git a/lib/prserv/db.py b/lib/prserv/db.py
> index 7bc2b2dc2d..7c200602ed 100644
> --- a/lib/prserv/db.py
> +++ b/lib/prserv/db.py
> @@ -78,6 +78,52 @@ class PRTable(object):
>              self.sync()
>              self.dirty = False
>
> +    def test_package(self, version, pkgarch):
> +        """Returns whether the specified package version is found in the
> database for the specified architecture"""
> +
> +        # Just returns the value if found or None otherwise
> +        data=self._execute("SELECT value FROM %s WHERE version=? AND
> pkgarch=?;" % self.table,
> +                           (version, pkgarch))
> +        row=data.fetchone()
> +        if row is not None:
> +            return True
> +        else:
> +            return False
> +
> +    def test_value(self, version, pkgarch, value):
> +        """Returns whether the specified value is found in the database
> for the specified package and architecture"""
> +
> +        # Just returns the value if found or None otherwise
> +        data=self._execute("SELECT value FROM %s WHERE version=? AND
> pkgarch=? and value=?;" % self.table,
> +                           (version, pkgarch, value))
> +        row=data.fetchone()
> +        if row is not None:
> +            return True
> +        else:
> +            return False
> +
> +    def find_value(self, version, pkgarch, checksum):
> +        """Returns the value for the specified checksum if found or None
> otherwise."""
> +
> +        data=self._execute("SELECT value FROM %s WHERE version=? AND
> pkgarch=? AND checksum=?;" % self.table,
> +                           (version, pkgarch, checksum))
> +        row=data.fetchone()
> +        if row is not None:
> +            return row[0]
> +        else:
> +            return None
> +
> +    def find_max_value(self, version, pkgarch):
> +        """Returns the greatest value for (version, pkgarch), or None if
> not found. Doesn't create a new value"""
> +
> +        data = self._execute("SELECT max(value) FROM %s where version=?
> AND pkgarch=?;" % (self.table),
> +                             (version, pkgarch))
> +        row = data.fetchone()
> +        if row is not None:
> +            return row[0]
> +        else:
> +            return None
> +
>      def _get_value_hist(self, version, pkgarch, checksum):
>          data=self._execute("SELECT value FROM %s WHERE version=? AND
> pkgarch=? AND checksum=?;" % self.table,
>                             (version, pkgarch, checksum))
> diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py
> index efb2e0cf93..86bd3bb75f 100644
> --- a/lib/prserv/serv.py
> +++ b/lib/prserv/serv.py
> @@ -26,6 +26,9 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
>
>          self.handlers.update({
>              "get-pr": self.handle_get_pr,
> +            "test-pr": self.handle_test_pr,
> +            "test-package": self.handle_test_package,
> +            "max-package-pr": self.handle_max_package_pr,
>              "import-one": self.handle_import_one,
>              "export": self.handle_export,
>              "is-readonly": self.handle_is_readonly,
> @@ -43,6 +46,31 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
>          else:
>              self.server.table.sync_if_dirty()
>
> +    async def handle_test_pr(self, request):
> +        '''Finds the PR value corresponding to the request. If not found,
> returns None and doesn't insert a new value'''
> +        version = request["version"]
> +        pkgarch = request["pkgarch"]
> +        checksum = request["checksum"]
> +
> +        value = self.server.table.find_value(version, pkgarch, checksum)
> +        return {"value": value}
> +
> +    async def handle_test_package(self, request):
> +        '''Tells whether there are entries for (version, pkgarch) in the
> db. Returns True or False'''
> +        version = request["version"]
> +        pkgarch = request["pkgarch"]
> +
> +        value = self.server.table.test_package(version, pkgarch)
> +        return {"value": value}
> +
> +    async def handle_max_package_pr(self, request):
> +        '''Finds the greatest PR value for (version, pkgarch) in the db.
> Returns None if no entry was found'''
> +        version = request["version"]
> +        pkgarch = request["pkgarch"]
> +
> +        value = self.server.table.find_max_value(version, pkgarch)
> +        return {"value": value}
> +
>      async def handle_get_pr(self, request):
>          version = request["version"]
>          pkgarch = request["pkgarch"]
> --
> 2.34.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#16081):
> https://lists.openembedded.org/g/bitbake-devel/message/16081
> Mute This Topic: https://lists.openembedded.org/mt/105479094/1050810
> Group Owner: bitbake-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub [
> bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/lib/prserv/client.py b/lib/prserv/client.py
index 7bc5188c53..8471ee3046 100644
--- a/lib/prserv/client.py
+++ b/lib/prserv/client.py
@@ -20,6 +20,27 @@  class PRAsyncClient(bb.asyncrpc.AsyncClient):
         if response:
             return response["value"]
 
+    async def test_pr(self, version, pkgarch, checksum):
+        response = await self.invoke(
+            {"test-pr": {"version": version, "pkgarch": pkgarch, "checksum": checksum}}
+        )
+        if response:
+            return response["value"]
+
+    async def test_package(self, version, pkgarch):
+        response = await self.invoke(
+            {"test-package": {"version": version, "pkgarch": pkgarch}}
+        )
+        if response:
+            return response["value"]
+
+    async def max_package_pr(self, version, pkgarch):
+        response = await self.invoke(
+            {"max-package-pr": {"version": version, "pkgarch": pkgarch}}
+        )
+        if response:
+            return response["value"]
+
     async def importone(self, version, pkgarch, checksum, value):
         response = await self.invoke(
             {"import-one": {"version": version, "pkgarch": pkgarch, "checksum": checksum, "value": value}}
@@ -44,7 +65,7 @@  class PRAsyncClient(bb.asyncrpc.AsyncClient):
 class PRClient(bb.asyncrpc.Client):
     def __init__(self):
         super().__init__()
-        self._add_methods("getPR", "importone", "export", "is_readonly")
+        self._add_methods("getPR", "test_pr", "test_package", "importone", "export", "is_readonly")
 
     def _get_async_client(self):
         return PRAsyncClient()
diff --git a/lib/prserv/db.py b/lib/prserv/db.py
index 7bc2b2dc2d..7c200602ed 100644
--- a/lib/prserv/db.py
+++ b/lib/prserv/db.py
@@ -78,6 +78,52 @@  class PRTable(object):
             self.sync()
             self.dirty = False
 
+    def test_package(self, version, pkgarch):
+        """Returns whether the specified package version is found in the database for the specified architecture"""
+
+        # Just returns the value if found or None otherwise
+        data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=?;" % self.table,
+                           (version, pkgarch))
+        row=data.fetchone()
+        if row is not None:
+            return True
+        else:
+            return False
+
+    def test_value(self, version, pkgarch, value):
+        """Returns whether the specified value is found in the database for the specified package and architecture"""
+
+        # Just returns the value if found or None otherwise
+        data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? and value=?;" % self.table,
+                           (version, pkgarch, value))
+        row=data.fetchone()
+        if row is not None:
+            return True
+        else:
+            return False
+
+    def find_value(self, version, pkgarch, checksum):
+        """Returns the value for the specified checksum if found or None otherwise."""
+
+        data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table,
+                           (version, pkgarch, checksum))
+        row=data.fetchone()
+        if row is not None:
+            return row[0]
+        else:
+            return None
+
+    def find_max_value(self, version, pkgarch):
+        """Returns the greatest value for (version, pkgarch), or None if not found. Doesn't create a new value"""
+
+        data = self._execute("SELECT max(value) FROM %s where version=? AND pkgarch=?;" % (self.table),
+                             (version, pkgarch))
+        row = data.fetchone()
+        if row is not None:
+            return row[0]
+        else:
+            return None
+
     def _get_value_hist(self, version, pkgarch, checksum):
         data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table,
                            (version, pkgarch, checksum))
diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py
index efb2e0cf93..86bd3bb75f 100644
--- a/lib/prserv/serv.py
+++ b/lib/prserv/serv.py
@@ -26,6 +26,9 @@  class PRServerClient(bb.asyncrpc.AsyncServerConnection):
 
         self.handlers.update({
             "get-pr": self.handle_get_pr,
+            "test-pr": self.handle_test_pr,
+            "test-package": self.handle_test_package,
+            "max-package-pr": self.handle_max_package_pr,
             "import-one": self.handle_import_one,
             "export": self.handle_export,
             "is-readonly": self.handle_is_readonly,
@@ -43,6 +46,31 @@  class PRServerClient(bb.asyncrpc.AsyncServerConnection):
         else:
             self.server.table.sync_if_dirty()
 
+    async def handle_test_pr(self, request):
+        '''Finds the PR value corresponding to the request. If not found, returns None and doesn't insert a new value'''
+        version = request["version"]
+        pkgarch = request["pkgarch"]
+        checksum = request["checksum"]
+
+        value = self.server.table.find_value(version, pkgarch, checksum)
+        return {"value": value}
+
+    async def handle_test_package(self, request):
+        '''Tells whether there are entries for (version, pkgarch) in the db. Returns True or False'''
+        version = request["version"]
+        pkgarch = request["pkgarch"]
+
+        value = self.server.table.test_package(version, pkgarch)
+        return {"value": value}
+
+    async def handle_max_package_pr(self, request):
+        '''Finds the greatest PR value for (version, pkgarch) in the db. Returns None if no entry was found'''
+        version = request["version"]
+        pkgarch = request["pkgarch"]
+
+        value = self.server.table.find_max_value(version, pkgarch)
+        return {"value": value}
+
     async def handle_get_pr(self, request):
         version = request["version"]
         pkgarch = request["pkgarch"]