diff options
Diffstat (limited to 'meta/lib/oeqa/runtime/context.py')
-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): |