[v2,06/26] manifest.py: Dynamic load of manifest

Submitted by Fredrik Gustafsson on June 25, 2020, 10:21 a.m. | Patch ID: 173889

Details

Message ID 20200625102145.7139-7-fredrigu@axis.com
State New
Headers show

Commit Message

Fredrik Gustafsson June 25, 2020, 10:21 a.m.
Decide which manifest we should load in run time without any hard coded
values but look at which package type that is used.

Signed-off-by: Fredrik Gustafsson <fredrigu@axis.com>
---
 meta/lib/oe/manifest.py                      | 10 ++------
 meta/lib/oe/package_managers/deb/manifest.py |  2 +-
 meta/lib/oe/package_managers/ipk/manifest.py |  2 +-
 meta/lib/oe/package_managers/rpm/manifest.py |  2 +-
 meta/lib/oe/rootfs.py                        | 13 +++++-----
 meta/lib/oe/sdk.py                           | 27 +++++++-------------
 6 files changed, 20 insertions(+), 36 deletions(-)

Patch hide | download patch | download mbox

diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py
index d93edfcac5..a8d14244c0 100644
--- a/meta/lib/oe/manifest.py
+++ b/meta/lib/oe/manifest.py
@@ -190,14 +190,8 @@  class Manifest(object, metaclass=ABCMeta):
 
 def create_manifest(d, final_manifest=False, manifest_dir=None,
                     manifest_type=Manifest.MANIFEST_TYPE_IMAGE):
-    from oe.package_managers.rpm.manifest import RpmManifest
-    from oe.package_managers.ipk.manifest import OpkgManifest
-    from oe.package_managers.deb.manifest import DpkgManifest
-    manifest_map = {'rpm': RpmManifest,
-                    'ipk': OpkgManifest,
-                    'deb': DpkgManifest}
-
-    manifest = manifest_map[d.getVar('IMAGE_PKGTYPE')](d, manifest_dir, manifest_type)
+    import importlib
+    manifest = importlib.import_module('oe.package_managers.' + d.getVar('IMAGE_PKGTYPE') + '.manifest').PkgManifest(d, manifest_dir, manifest_type)
 
     if final_manifest:
         manifest.create_final()
diff --git a/meta/lib/oe/package_managers/deb/manifest.py b/meta/lib/oe/package_managers/deb/manifest.py
index 9b186555dc..5daf709e6c 100644
--- a/meta/lib/oe/package_managers/deb/manifest.py
+++ b/meta/lib/oe/package_managers/deb/manifest.py
@@ -4,7 +4,7 @@ 
 
 from oe.manifest import *
 
-class DpkgManifest(Manifest):
+class PkgManifest(Manifest):
     def create_initial(self):
         with open(self.initial_manifest, "w+") as manifest:
             manifest.write(self.initial_manifest_file_header)
diff --git a/meta/lib/oe/package_managers/ipk/manifest.py b/meta/lib/oe/package_managers/ipk/manifest.py
index be87f3d1b7..cf3097224f 100644
--- a/meta/lib/oe/package_managers/ipk/manifest.py
+++ b/meta/lib/oe/package_managers/ipk/manifest.py
@@ -4,7 +4,7 @@ 
 
 from oe.manifest import *
 
-class OpkgManifest(Manifest):
+class PkgManifest(Manifest):
     """
     Returns a dictionary object with mip and mlp packages.
     """
diff --git a/meta/lib/oe/package_managers/rpm/manifest.py b/meta/lib/oe/package_managers/rpm/manifest.py
index a225ee7a23..801e50e8b6 100644
--- a/meta/lib/oe/package_managers/rpm/manifest.py
+++ b/meta/lib/oe/package_managers/rpm/manifest.py
@@ -4,7 +4,7 @@ 
 
 from oe.manifest import *
 
-class RpmManifest(Manifest):
+class PkgManifest(Manifest):
     """
     Returns a dictionary object with mip and mlp packages.
     """
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index ab10edfec0..c3cfb58493 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -12,7 +12,6 @@  import os
 import subprocess
 import re
 
-
 class Rootfs(object, metaclass=ABCMeta):
     """
     This is an abstract class. Do not instantiate this directly.
@@ -359,8 +358,8 @@  class RpmRootfs(Rootfs):
         self.log_check_regex = r'(unpacking of archive failed|Cannot find package'\
                                r'|exit 1|ERROR: |Error: |Error |ERROR '\
                                r'|Failed |Failed: |Failed$|Failed\(\d+\):)'
-        from oe.package_managers.rpm.manifest import RpmManifest
-        self.manifest = RpmManifest(d, manifest_dir)
+        import importlib
+        self.manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, manifest_dir)
 
         self.pm = RpmPM(d,
                         d.getVar('IMAGE_ROOTFS'),
@@ -614,8 +613,8 @@  class DpkgRootfs(DpkgOpkgRootfs):
 
         bb.utils.remove(self.image_rootfs, True)
         bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True)
-        from oe.package_managers.deb.manifest import DpkgManifest
-        self.manifest = DpkgManifest(d, manifest_dir)
+        import importlib
+        self.manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, manifest_dir)
         self.pm = DpkgPM(d, d.getVar('IMAGE_ROOTFS'),
                          d.getVar('PACKAGE_ARCHS'),
                          d.getVar('DPKG_ARCH'))
@@ -699,8 +698,8 @@  class OpkgRootfs(DpkgOpkgRootfs):
         super(OpkgRootfs, self).__init__(d, progress_reporter, logcatcher)
         self.log_check_regex = '(exit 1|Collected errors)'
 
-        from oe.package_managers.ipk.manifest import OpkgManifest
-        self.manifest = OpkgManifest(d, manifest_dir)
+        import importlib
+        self.manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, manifest_dir)
         self.opkg_conf = self.d.getVar("IPKGCONF_TARGET")
         self.pkg_archs = self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS")
 
diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py
index 70451a0b3a..18f6c16bd2 100644
--- a/meta/lib/oe/sdk.py
+++ b/meta/lib/oe/sdk.py
@@ -114,11 +114,9 @@  class RpmSdk(Sdk):
     def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"):
         super(RpmSdk, self).__init__(d, manifest_dir)
 
-        from oe.package_managers.rpm.manifest import RpmManifest
-        self.target_manifest = RpmManifest(d, self.manifest_dir,
-                                           Manifest.MANIFEST_TYPE_SDK_TARGET)
-        self.host_manifest = RpmManifest(d, self.manifest_dir,
-                                         Manifest.MANIFEST_TYPE_SDK_HOST)
+        import importlib
+        self.target_manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET)
+        self.host_manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST)
 
         rpm_repo_workdir = "oe-sdk-repo"
         if "sdk_ext" in d.getVar("BB_RUNTASK"):
@@ -232,14 +230,9 @@  class OpkgSdk(Sdk):
         if "sdk_ext" in d.getVar("BB_RUNTASK"):
             ipk_repo_workdir = "oe-sdk-ext-repo"
 
-        from oe.package_managers.ipk.manifest import OpkgManifest
-        self.target_pm = OpkgPM(d, self.sdk_target_sysroot, self.target_conf,
-                                self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS"), 
-                                ipk_repo_workdir=ipk_repo_workdir)
-
-        self.host_pm = OpkgPM(d, self.sdk_host_sysroot, self.host_conf,
-                              self.d.getVar("SDK_PACKAGE_ARCHS"),
-                                ipk_repo_workdir=ipk_repo_workdir)
+        import importlib
+        self.target_manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, self.sdk_target_sysroot, self.target_conf, self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS"), ipk_repo_workdir=ipk_repo_workdir)
+        self.host_manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, self.sdk_host_sysroot, self.host_conf, self.d.getVar("SDK_PACKAGE_ARCHS"), ipk_repo_workdir=ipk_repo_workdir)
 
     def _populate_sysroot(self, pm, manifest):
         pkgs_to_install = manifest.parse_initial_manifest()
@@ -310,11 +303,9 @@  class DpkgSdk(Sdk):
         self.target_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), "apt")
         self.host_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), "apt-sdk")
 
-        from oe.package_managers.deb.manifest import DpkgManifest
-        self.target_manifest = DpkgManifest(d, self.manifest_dir,
-                                            Manifest.MANIFEST_TYPE_SDK_TARGET)
-        self.host_manifest = DpkgManifest(d, self.manifest_dir,
-                                          Manifest.MANIFEST_TYPE_SDK_HOST)
+        import importlib
+        self.target_manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET)
+        self.host_manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST)
 
         deb_repo_workdir = "oe-sdk-repo"
         if "sdk_ext" in d.getVar("BB_RUNTASK"):

Comments

Paul Barker June 25, 2020, 10:41 a.m.
On Thu, 25 Jun 2020 at 11:22, Fredrik Gustafsson
<fredrik.gustafsson@axis.com> wrote:
>
> Decide which manifest we should load in run time without any hard coded
> values but look at which package type that is used.
>
> Signed-off-by: Fredrik Gustafsson <fredrigu@axis.com>
> ---
>  meta/lib/oe/manifest.py                      | 10 ++------
>  meta/lib/oe/package_managers/deb/manifest.py |  2 +-
>  meta/lib/oe/package_managers/ipk/manifest.py |  2 +-
>  meta/lib/oe/package_managers/rpm/manifest.py |  2 +-
>  meta/lib/oe/rootfs.py                        | 13 +++++-----
>  meta/lib/oe/sdk.py                           | 27 +++++++-------------
>  6 files changed, 20 insertions(+), 36 deletions(-)
>
> diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py
> index d93edfcac5..a8d14244c0 100644
> --- a/meta/lib/oe/manifest.py
> +++ b/meta/lib/oe/manifest.py
> @@ -190,14 +190,8 @@ class Manifest(object, metaclass=ABCMeta):
>
>  def create_manifest(d, final_manifest=False, manifest_dir=None,
>                      manifest_type=Manifest.MANIFEST_TYPE_IMAGE):
> -    from oe.package_managers.rpm.manifest import RpmManifest
> -    from oe.package_managers.ipk.manifest import OpkgManifest
> -    from oe.package_managers.deb.manifest import DpkgManifest
> -    manifest_map = {'rpm': RpmManifest,
> -                    'ipk': OpkgManifest,
> -                    'deb': DpkgManifest}
> -
> -    manifest = manifest_map[d.getVar('IMAGE_PKGTYPE')](d, manifest_dir, manifest_type)
> +    import importlib
> +    manifest = importlib.import_module('oe.package_managers.' + d.getVar('IMAGE_PKGTYPE') + '.manifest').PkgManifest(d, manifest_dir, manifest_type)
>
>      if final_manifest:
>          manifest.create_final()
> diff --git a/meta/lib/oe/package_managers/deb/manifest.py b/meta/lib/oe/package_managers/deb/manifest.py
> index 9b186555dc..5daf709e6c 100644
> --- a/meta/lib/oe/package_managers/deb/manifest.py
> +++ b/meta/lib/oe/package_managers/deb/manifest.py
> @@ -4,7 +4,7 @@
>
>  from oe.manifest import *
>
> -class DpkgManifest(Manifest):
> +class PkgManifest(Manifest):
>      def create_initial(self):
>          with open(self.initial_manifest, "w+") as manifest:
>              manifest.write(self.initial_manifest_file_header)
> diff --git a/meta/lib/oe/package_managers/ipk/manifest.py b/meta/lib/oe/package_managers/ipk/manifest.py
> index be87f3d1b7..cf3097224f 100644
> --- a/meta/lib/oe/package_managers/ipk/manifest.py
> +++ b/meta/lib/oe/package_managers/ipk/manifest.py
> @@ -4,7 +4,7 @@
>
>  from oe.manifest import *
>
> -class OpkgManifest(Manifest):
> +class PkgManifest(Manifest):
>      """
>      Returns a dictionary object with mip and mlp packages.
>      """
> diff --git a/meta/lib/oe/package_managers/rpm/manifest.py b/meta/lib/oe/package_managers/rpm/manifest.py
> index a225ee7a23..801e50e8b6 100644
> --- a/meta/lib/oe/package_managers/rpm/manifest.py
> +++ b/meta/lib/oe/package_managers/rpm/manifest.py
> @@ -4,7 +4,7 @@
>
>  from oe.manifest import *
>
> -class RpmManifest(Manifest):
> +class PkgManifest(Manifest):
>      """
>      Returns a dictionary object with mip and mlp packages.
>      """
> diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
> index ab10edfec0..c3cfb58493 100644
> --- a/meta/lib/oe/rootfs.py
> +++ b/meta/lib/oe/rootfs.py
> @@ -12,7 +12,6 @@ import os
>  import subprocess
>  import re
>
> -
>  class Rootfs(object, metaclass=ABCMeta):
>      """
>      This is an abstract class. Do not instantiate this directly.
> @@ -359,8 +358,8 @@ class RpmRootfs(Rootfs):
>          self.log_check_regex = r'(unpacking of archive failed|Cannot find package'\
>                                 r'|exit 1|ERROR: |Error: |Error |ERROR '\
>                                 r'|Failed |Failed: |Failed$|Failed\(\d+\):)'
> -        from oe.package_managers.rpm.manifest import RpmManifest
> -        self.manifest = RpmManifest(d, manifest_dir)
> +        import importlib
> +        self.manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, manifest_dir)
>
>          self.pm = RpmPM(d,
>                          d.getVar('IMAGE_ROOTFS'),
> @@ -614,8 +613,8 @@ class DpkgRootfs(DpkgOpkgRootfs):
>
>          bb.utils.remove(self.image_rootfs, True)
>          bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True)
> -        from oe.package_managers.deb.manifest import DpkgManifest
> -        self.manifest = DpkgManifest(d, manifest_dir)
> +        import importlib
> +        self.manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, manifest_dir)
>          self.pm = DpkgPM(d, d.getVar('IMAGE_ROOTFS'),
>                           d.getVar('PACKAGE_ARCHS'),
>                           d.getVar('DPKG_ARCH'))
> @@ -699,8 +698,8 @@ class OpkgRootfs(DpkgOpkgRootfs):
>          super(OpkgRootfs, self).__init__(d, progress_reporter, logcatcher)
>          self.log_check_regex = '(exit 1|Collected errors)'
>
> -        from oe.package_managers.ipk.manifest import OpkgManifest
> -        self.manifest = OpkgManifest(d, manifest_dir)
> +        import importlib
> +        self.manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, manifest_dir)
>          self.opkg_conf = self.d.getVar("IPKGCONF_TARGET")
>          self.pkg_archs = self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS")
>
> diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py
> index 70451a0b3a..18f6c16bd2 100644
> --- a/meta/lib/oe/sdk.py
> +++ b/meta/lib/oe/sdk.py
> @@ -114,11 +114,9 @@ class RpmSdk(Sdk):
>      def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"):
>          super(RpmSdk, self).__init__(d, manifest_dir)
>
> -        from oe.package_managers.rpm.manifest import RpmManifest
> -        self.target_manifest = RpmManifest(d, self.manifest_dir,
> -                                           Manifest.MANIFEST_TYPE_SDK_TARGET)
> -        self.host_manifest = RpmManifest(d, self.manifest_dir,
> -                                         Manifest.MANIFEST_TYPE_SDK_HOST)
> +        import importlib
> +        self.target_manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET)
> +        self.host_manifest = importlib.import_module('oe.package_managers.rpm.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST)
>
>          rpm_repo_workdir = "oe-sdk-repo"
>          if "sdk_ext" in d.getVar("BB_RUNTASK"):
> @@ -232,14 +230,9 @@ class OpkgSdk(Sdk):
>          if "sdk_ext" in d.getVar("BB_RUNTASK"):
>              ipk_repo_workdir = "oe-sdk-ext-repo"
>
> -        from oe.package_managers.ipk.manifest import OpkgManifest
> -        self.target_pm = OpkgPM(d, self.sdk_target_sysroot, self.target_conf,
> -                                self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS"),
> -                                ipk_repo_workdir=ipk_repo_workdir)
> -
> -        self.host_pm = OpkgPM(d, self.sdk_host_sysroot, self.host_conf,
> -                              self.d.getVar("SDK_PACKAGE_ARCHS"),
> -                                ipk_repo_workdir=ipk_repo_workdir)
> +        import importlib
> +        self.target_manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, self.sdk_target_sysroot, self.target_conf, self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS"), ipk_repo_workdir=ipk_repo_workdir)
> +        self.host_manifest = importlib.import_module('oe.package_managers.ipk.manifest').PkgManifest(d, self.sdk_host_sysroot, self.host_conf, self.d.getVar("SDK_PACKAGE_ARCHS"), ipk_repo_workdir=ipk_repo_workdir)
>
>      def _populate_sysroot(self, pm, manifest):
>          pkgs_to_install = manifest.parse_initial_manifest()
> @@ -310,11 +303,9 @@ class DpkgSdk(Sdk):
>          self.target_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), "apt")
>          self.host_conf_dir = os.path.join(self.d.getVar("APTCONF_TARGET"), "apt-sdk")
>
> -        from oe.package_managers.deb.manifest import DpkgManifest
> -        self.target_manifest = DpkgManifest(d, self.manifest_dir,
> -                                            Manifest.MANIFEST_TYPE_SDK_TARGET)
> -        self.host_manifest = DpkgManifest(d, self.manifest_dir,
> -                                          Manifest.MANIFEST_TYPE_SDK_HOST)
> +        import importlib
> +        self.target_manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET)
> +        self.host_manifest = importlib.import_module('oe.package_managers.deb.manifest').PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST)
>
>          deb_repo_workdir = "oe-sdk-repo"
>          if "sdk_ext" in d.getVar("BB_RUNTASK"):
> --
> 2.20.1

This is a functional change rather than just moving code. I recommend
the first patch series here just moves the relevant code and adds
additional imports, redirection, etc as needed. Once that's reviewed
and merged then we can look at a follow up series to make things more
dynamic and support package managers being added by other layers.

Mixing the functional changes and the code moves in a single series
makes review & testing difficult.

I also think we'd need a test case for this. Perhaps a dummy package
manager can be added in the meta-selftest layer and a selftest case
can confirm that this is loaded.


--
Paul Barker
Konsulko Group
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#139941): https://lists.openembedded.org/g/openembedded-core/message/139941
Mute This Topic: https://lists.openembedded.org/mt/75099999/3617530
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  [oe-patchwork@oe-patch.openembedded.org]
-=-=-=-=-=-=-=-=-=-=-=-