diff options
| author | Juro Bystricky <juro.bystricky@intel.com> | 2017-02-06 09:49:37 -0800 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-02-15 09:29:55 -0800 |
| commit | b1f99066bd8ff787c126ed26ab71fa67b30f15d5 (patch) | |
| tree | 9bee8cfc26015976d2c0732272f74584a14c1324 /meta/lib/oeqa | |
| parent | 124f689569c687070c70b73fc9b7eeee4c730208 (diff) | |
| download | poky-b1f99066bd8ff787c126ed26ab71fa67b30f15d5.tar.gz | |
testimage: Implement custom target loading
This patch implements custom target loading for testimage, currently
missing due to major changes to the test framework.
Custom targets can be defined in various meta-layers, so we
need an extra path information in order to find them.
Any other additional info is retrieved as usual via the variables
TEST_TARGET and TEST_SUITES
(From OE-Core rev: 1dc8010afd71fe46fb28bb86fb7c07a5fbd3d7cf)
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa')
| -rw-r--r-- | meta/lib/oeqa/runtime/context.py | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/meta/lib/oeqa/runtime/context.py b/meta/lib/oeqa/runtime/context.py index e5e0141c2a..ea1b4a643e 100644 --- a/meta/lib/oeqa/runtime/context.py +++ b/meta/lib/oeqa/runtime/context.py | |||
| @@ -89,7 +89,7 @@ class OERuntimeTestContextExecutor(OETestContextExecutor): | |||
| 89 | help="Qemu boot configuration, only needed when target_type is QEMU.") | 89 | help="Qemu boot configuration, only needed when target_type is QEMU.") |
| 90 | 90 | ||
| 91 | @staticmethod | 91 | @staticmethod |
| 92 | def getTarget(target_type, logger, target_ip, server_ip, **kwargs): | 92 | def getTarget(target_type, target_modules_path, logger, target_ip, server_ip, **kwargs): |
| 93 | target = None | 93 | target = None |
| 94 | 94 | ||
| 95 | if target_type == 'simpleremote': | 95 | if target_type == 'simpleremote': |
| @@ -97,11 +97,79 @@ class OERuntimeTestContextExecutor(OETestContextExecutor): | |||
| 97 | elif target_type == 'qemu': | 97 | elif target_type == 'qemu': |
| 98 | target = OEQemuTarget(logger, target_ip, server_ip, **kwargs) | 98 | target = OEQemuTarget(logger, target_ip, server_ip, **kwargs) |
| 99 | else: | 99 | else: |
| 100 | # TODO: Implement custom target module loading | 100 | # Custom target module loading |
| 101 | raise TypeError("target_type %s isn't supported" % target_type) | 101 | try: |
| 102 | controller = OERuntimeTestContextExecutor.getControllerModule(target_type, target_modules_path) | ||
| 103 | target = controller(logger, target_ip, server_ip, **kwargs) | ||
| 104 | except ImportError as e: | ||
| 105 | raise TypeError("Failed to import %s from available controller modules" % target_type) | ||
| 102 | 106 | ||
| 103 | return target | 107 | return target |
| 104 | 108 | ||
| 109 | # Search oeqa.controllers module directory for and return a controller | ||
| 110 | # corresponding to the given target name. | ||
| 111 | # AttributeError raised if not found. | ||
| 112 | # ImportError raised if a provided module can not be imported. | ||
| 113 | @staticmethod | ||
| 114 | def getControllerModule(target, target_modules_path): | ||
| 115 | controllerslist = OERuntimeTestContextExecutor._getControllerModulenames(target_modules_path) | ||
| 116 | controller = OERuntimeTestContextExecutor._loadControllerFromName(target, controllerslist) | ||
| 117 | return controller | ||
| 118 | |||
| 119 | # Return a list of all python modules in lib/oeqa/controllers for each | ||
| 120 | # layer in bbpath | ||
| 121 | @staticmethod | ||
| 122 | def _getControllerModulenames(target_modules_path): | ||
| 123 | |||
| 124 | controllerslist = [] | ||
| 125 | |||
| 126 | def add_controller_list(path): | ||
| 127 | if not os.path.exists(os.path.join(path, '__init__.py')): | ||
| 128 | raise OSError('Controllers directory %s exists but is missing __init__.py' % path) | ||
| 129 | files = sorted([f for f in os.listdir(path) if f.endswith('.py') and not f.startswith('_')]) | ||
| 130 | for f in files: | ||
| 131 | module = 'oeqa.controllers.' + f[:-3] | ||
| 132 | if module not in controllerslist: | ||
| 133 | controllerslist.append(module) | ||
| 134 | else: | ||
| 135 | raise RuntimeError("Duplicate controller module found for %s. Layers should create unique controller module names" % module) | ||
| 136 | |||
| 137 | extpath = target_modules_path.split(':') | ||
| 138 | for p in extpath: | ||
| 139 | controllerpath = os.path.join(p, 'lib', 'oeqa', 'controllers') | ||
| 140 | if os.path.exists(controllerpath): | ||
| 141 | add_controller_list(controllerpath) | ||
| 142 | return controllerslist | ||
| 143 | |||
| 144 | # Search for and return a controller from given target name and | ||
| 145 | # set of module names. | ||
| 146 | # Raise AttributeError if not found. | ||
| 147 | # Raise ImportError if a provided module can not be imported | ||
| 148 | @staticmethod | ||
| 149 | def _loadControllerFromName(target, modulenames): | ||
| 150 | for name in modulenames: | ||
| 151 | obj = OERuntimeTestContextExecutor._loadControllerFromModule(target, name) | ||
| 152 | if obj: | ||
| 153 | return obj | ||
| 154 | raise AttributeError("Unable to load {0} from available modules: {1}".format(target, str(modulenames))) | ||
| 155 | |||
| 156 | # Search for and return a controller or None from given module name | ||
| 157 | @staticmethod | ||
| 158 | def _loadControllerFromModule(target, modulename): | ||
| 159 | obj = None | ||
| 160 | # import module, allowing it to raise import exception | ||
| 161 | try: | ||
| 162 | module = __import__(modulename, globals(), locals(), [target]) | ||
| 163 | except Exception as e: | ||
| 164 | return obj | ||
| 165 | # look for target class in the module, catching any exceptions as it | ||
| 166 | # is valid that a module may not have the target class. | ||
| 167 | try: | ||
| 168 | obj = getattr(module, target) | ||
| 169 | except: | ||
| 170 | obj = None | ||
| 171 | return obj | ||
| 172 | |||
| 105 | @staticmethod | 173 | @staticmethod |
| 106 | def readPackagesManifest(manifest): | 174 | def readPackagesManifest(manifest): |
| 107 | if not manifest or not os.path.exists(manifest): | 175 | if not manifest or not os.path.exists(manifest): |
