#158 Bodhi: Fixes and improvements
Merged 3 years ago by frantisekz. Opened 3 years ago by frantisekz.

file modified
+13 -3
@@ -81,6 +81,7 @@ 

  

      return {

          "pretty_name": update["title"],

+         "builds_nvrs": [build["nvr"] for build in update["builds"]],

          "updateid": update["alias"],

          "submission_date": update["date_submitted"],

          # Bodhi usually pushes updates around 2 or 3 am.. we don't need to not care too much about the exact hour,
@@ -91,7 +92,8 @@ 

                  (datetime.datetime.fromisoformat(update["date_modified"] or update["date_submitted"]) +

                  datetime.timedelta(days=(update["stable_days"] + 1))).replace(hour=2, minute=0, second=0)

              ) if update["autotime"] else None,

-         "release": release_from_nvr(update["title"], releases),

+         "release": update["release"]["long_name"],

+         "content_type": update["content_type"],

          "url": update["url"],

          "status": "%s→%s" % (update["status"], update["request"]) if update["request"] else update["status"],

          "karma": update["karma"],
@@ -115,16 +117,18 @@ 

      }

  

  

- def get_updates(packages, raw_updates):

+ def get_updates(packages, content_type="rpm", raw_updates=None, releases=None):

      """

      Gets list of user owned packages and libkarma dump of all updates

      Returns dict of user owned packages and updates for them

      package_name: {

          "pretty_name": update["title"],

+         "builds_nvrs": ["nvr" for each build included],

          "updateid": update["alias"],

          "submission_date": update["date_submitted"],

          "stable_by_time": (update["date_submitted"] + update["stable_days"]) if update["autotime"] else None,

          "release": release_from_nvr(update["title"]),

+         "content_type": "rpm",

          "url": update["url"],

          "status": update["status"],

          "karma": update["karma"],
@@ -134,7 +138,11 @@ 

      if len(packages) == 0:

          return {}

  

-     releases = CACHE.get("fedora_releases")

+     if releases is None:

+         releases = CACHE.get("fedora_releases")

+ 

+     if raw_updates is None:

+         raw_updates = CACHE.get("bodhi_updates")

  

      data = {}

      # Prepare dict items for each package
@@ -147,6 +155,8 @@ 

          for package in packages:

              present_updates = set()  # helper set to deduplicate updates containing more than one package

              for update in raw_updates[release]:

+                 if update["content_type"] != content_type:

+                     continue

                  for build in update["builds"]:

                      if name_in_nevra(package, build["nvr"]) and update["alias"] not in present_updates:

                          data[package].append(process_update(update, releases))

@@ -191,9 +191,9 @@ 

      if releases is None:

          releases = CACHE.get("fedora_releases")

  

-     if nvr.startswith("fedora-"):

-         # fedora- packages do not contain distag, workaround it

-         # eg. "fedora-obsolete-packages-32-51", release is "Fedora 32"

+     if ".fc" not in nvr and ".el" not in nvr:

+         # bunch of fedora- (fedora-repos, fedora-release, (fedora/epel)-obsolete-packages) packages

+         # do not contain distag, workaround it, eg. "fedora-obsolete-packages-32-51", release is "Fedora 32"

          return release_from_dist("f%s" % nvr.split("-")[-2], releases)

  

      split = nvr.split(".")[-1]

file modified
+5 -8
@@ -143,7 +143,7 @@ 

      if releases is None:

          releases = CACHE.get("fedora_releases")

      if updates is None:

-         updates = bodhi.get_updates([package], CACHE.get('bodhi_updates'))

+         updates = bodhi.get_updates([package], content_type="rpm", raw_updates=CACHE.get('bodhi_updates'), releases=releases)

      if not versions_cache:

          versions_cache = CACHE.get("package_versions_generic")

  
@@ -163,20 +163,17 @@ 

  

          for update in updates[package]:

              if update["release"] == release_string:

-                 # And we are gonna to do something very ugly

-                 # We can have updates containing multiple different packages now, separated by space

-                 update["pretty_name"] = update["pretty_name"].split(" ")

-                 for name in update["pretty_name"]:

-                     if package in name:

+                 for build in update["builds_nvrs"]:

+                     if package in build:

                          # Pending are updates that are:

                          # - currently in the void waiting to be pulled directly into stable

                          # - currently in the void waiting to be pulled directly into testing

                          # Testing are updates that are:

                          # - currently in testing waiting to be pulled directly into stable or not (and 🎉🎉🎉 in testing)

                          if update["status"] == "pending→testing" or update["status"] == "pending→stable":

-                             versions[release_string]["pending"] = name

+                             versions[release_string]["pending"] = build

                          elif update["status"] == "testing" or update["status"] == "testing→stable":

-                             versions[release_string]["testing"] = name

+                             versions[release_string]["testing"] = build

  

      return versions

  

@@ -204,10 +204,12 @@ 

                      'comments': 1,

                      'karma': 2,

                      'pretty_name': 'gjs-1.66.1-2.fc98',

+                     'builds_nvrs': ['gjs-1.66.1-2.fc98'],

                      'release': 'Fedora 98',

                      'stable_by_time': '2020-11-04 02:00:00',

                      'status': 'testing',

                      'submission_date': '2020-10-20 09:15:27',

+                     'content_type': 'rpm',

                      'updateid': 'FEDORA-2020-3f9a07db44',

                      'url': 'https://bodhi.fedoraproject.org/updates/FEDORA-2020-3f9a07db44'

                  }
@@ -221,10 +223,12 @@ 

                      'comments': 1,

                      'karma': 2,

                      'pretty_name': 'gjs-1.66.1-2.fc98 mozjs78-78.4.0-1.fc98',

+                     'builds_nvrs': ['gjs-1.66.1-2.fc98', 'mozjs78-78.4.0-1.fc98'],

                      'release': 'Fedora 98',

                      'stable_by_time': '2020-11-04 02:00:00',

                      'status': 'testing',

                      'submission_date': '2020-10-20 09:15:27',

+                     'content_type': 'rpm',

                      'updateid': 'FEDORA-2020-3f9a07db44',

                      'url': 'https://bodhi.fedoraproject.org/updates/FEDORA-2020-3f9a07db44'

                  }
@@ -234,26 +238,33 @@ 

                      'comments': 1,

                      'karma': 2,

                      'pretty_name': 'gjs-1.66.1-2.fc98 mozjs78-78.4.0-1.fc98',

+                     'builds_nvrs': ['gjs-1.66.1-2.fc98', 'mozjs78-78.4.0-1.fc98'],

                      'release': 'Fedora 98',

                      'stable_by_time': '2020-11-04 02:00:00',

                      'status': 'testing',

                      'submission_date': '2020-10-20 09:15:27',

+                     'content_type': 'rpm',

                      'updateid': 'FEDORA-2020-3f9a07db44',

                      'url': 'https://bodhi.fedoraproject.org/updates/FEDORA-2020-3f9a07db44'

                  }

              ]

          }

  

-         monkeypatch.setattr(CACHE, 'get', mock.MagicMock(return_value=self.stub_fedora_releases))

-         assert bodhi.get_updates(["gjs", "mozjs78"], self.mocked_bodhi_updates_resp) == expected_result_multiple_packages

+         assert bodhi.get_updates(["gjs", "mozjs78"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_multiple_packages

  

+         # Edit our update response for single package tests

          self.mocked_bodhi_updates_resp["F98"][0]["title"] = "gjs-1.66.1-2.fc98"

-         assert bodhi.get_updates(["gjs"], self.mocked_bodhi_updates_resp) == expected_result_single_package

+         self.mocked_bodhi_updates_resp["F98"][0]["builds"].pop()

+ 

+         assert bodhi.get_updates(["gjs"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_single_package

  

          expected_result_single_package["package_b"] = []

-         assert bodhi.get_updates(["gjs", "package_b"], self.mocked_bodhi_updates_resp) == expected_result_single_package

+         assert bodhi.get_updates(["gjs", "package_b"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_single_package

  

-         assert bodhi.get_updates([], self.mocked_bodhi_updates_resp) == {}

+         assert bodhi.get_updates([], raw_updates=self.mocked_bodhi_updates_resp, releases=self.stub_fedora_releases) == {}

  

          # Clean our expected dict

          expected_result_single_package.pop("package_b")
@@ -261,19 +272,22 @@ 

          # Change request to stable

          expected_result_single_package["gjs"][0]["status"] = "testing→stable"

          mocked_update_data[0]["request"] = "stable"

-         assert bodhi.get_updates(["gjs"], self.mocked_bodhi_updates_resp) == expected_result_single_package

+         assert bodhi.get_updates(["gjs"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_single_package

  

          # Change request to pending/testing

          expected_result_single_package["gjs"][0]["status"] = "pending→testing"

          mocked_update_data[0]["request"] = "testing"

          mocked_update_data[0]["status"] = "pending"

-         assert bodhi.get_updates(["gjs"], self.mocked_bodhi_updates_resp) == expected_result_single_package

+         assert bodhi.get_updates(["gjs"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_single_package

  

          # Try pending stable without testing

          expected_result_single_package["gjs"][0]["status"] = "pending→stable"

          mocked_update_data[0]["request"] = "stable"

          mocked_update_data[0]["status"] = "pending"

-         assert bodhi.get_updates(["gjs"], self.mocked_bodhi_updates_resp) == expected_result_single_package

+         assert bodhi.get_updates(["gjs"], content_type="rpm", raw_updates=self.mocked_bodhi_updates_resp,

+                                  releases=self.stub_fedora_releases) == expected_result_single_package

  

  

      def test_overrides(self, monkeypatch):

@@ -183,16 +183,19 @@ 

  

          stub_updates = {

              "package_a": [],

-             "package_b": [{"pretty_name": "package_b-2.0.1-1.fc98", "release": "Fedora 98", "status": "testing"}],

-             "package_c": [{"pretty_name": "package_c-3.1.0-1.fc98 package_x-0.1.0-1.fc98 package_y-0.0.1-1.fc98",

+             "package_b": [{"pretty_name": "package_b-2.0.1-1.fc98", "builds_nvrs": ["package_b-2.0.1-1.fc98"],

+                            "release": "Fedora 98", "status": "testing"}],

+             "package_c": [{"pretty_name": "I named the update differently because I COULD!",

+                            "builds_nvrs": ["package_c-3.1.0-1.fc98", "package_x-0.1.0-1.fc98", "package_y-0.0.1-1.fc98"],

                             "release": "Fedora 98", "status": "testing"}],

              "package_d": [{"pretty_name": "package_c-3.1.0-1.fc98 package_x-0.1.0-1.fc98 package_y-0.0.1-1.fc98",

+                            "builds_nvrs": ["package_c-3.1.0-1.fc98", "package_x-0.1.0-1.fc98", "package_y-0.0.1-1.fc98"],

                             "release": "Fedora 98", "status": "testing"}],

-             "package_e": [{"pretty_name": "package_e-4.0.0-1.fc98",

+             "package_e": [{"pretty_name": "package_e-4.0.0-1.fc98", "builds_nvrs": ["package_e-4.0.0-1.fc98"],

                  "release": "Fedora 98", "status": "testing→stable"}],

-             "package_f": [{"pretty_name": "package_f-4.0.0-1.fc98",

+             "package_f": [{"pretty_name": "package_f-4.0.0-1.fc98", "builds_nvrs": ["package_f-4.0.0-1.fc98"],

                  "release": "Fedora 98", "status": "pending→stable"}],

-             "package_g": [{"pretty_name": "package_g-4.0.0-1.fc98",

+             "package_g": [{"pretty_name": "package_g-4.0.0-1.fc98", "builds_nvrs": ["package_g-4.0.0-1.fc98"],

                  "release": "Fedora 98", "status": "pending→testing"}]

          }

  

  • Fixes https://pagure.io/fedora-qa/oraculum/issue/139

  • Prepares for rpm/module/flatpak support in Bodhi

  • Improves utils.versions.get_package_versions performance a bit

  • Changes utils.bodhi.get_updates arguments to make it consistent with rest of oraculum

  • Reuses release information for updates from bodhi instead of trying to figure it out ourselves

  • Properly reuses package build list from bodhi in utils.versions.get_package_versions instead of hacking around pretty_name (DB Cache compatibility break for handle 'bodhi_updates')

  • Updates hack in utils.dashboard_helpers.release_from_nvr to use the fallback route only when the dist tag is really borked (and not based on explicit list of broken packages)

Build succeeded.

Pull-Request has been merged by frantisekz

3 years ago