OLD | NEW |
1 import time, os, sys, urllib, re, signal, logging, datetime, glob, ConfigParser | 1 import time, os, sys, urllib, re, signal, logging, datetime, glob, ConfigParser |
2 import shutil | 2 import shutil |
3 try: | |
4 import koji | |
5 KOJI_INSTALLED = True | |
6 except ImportError: | |
7 KOJI_INSTALLED = False | |
8 from autotest_lib.client.bin import utils, test, os_dep | 3 from autotest_lib.client.bin import utils, test, os_dep |
9 from autotest_lib.client.common_lib import error | 4 from autotest_lib.client.common_lib import error |
10 import kvm_utils | 5 import kvm_utils |
11 | 6 |
12 | 7 |
13 def check_configure_options(script_path): | 8 def check_configure_options(script_path): |
14 """ | 9 """ |
15 Return the list of available options (flags) of a given kvm configure build | 10 Return the list of available options (flags) of a given kvm configure build |
16 script. | 11 script. |
17 | 12 |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 save_build(self.srcdir, self.results_dir) | 256 save_build(self.srcdir, self.results_dir) |
262 | 257 |
263 | 258 |
264 class KojiInstaller(YumInstaller): | 259 class KojiInstaller(YumInstaller): |
265 """ | 260 """ |
266 Class that handles installing KVM from the fedora build service, koji. | 261 Class that handles installing KVM from the fedora build service, koji. |
267 It uses yum to install and remove packages. | 262 It uses yum to install and remove packages. |
268 """ | 263 """ |
269 def __init__(self, test, params): | 264 def __init__(self, test, params): |
270 """ | 265 """ |
271 Initialize koji/brew session. | 266 Gets parameters and initializes the package downloader. |
272 | 267 |
273 @param test: kvm test object | 268 @param test: kvm test object |
274 @param params: Dictionary with test arguments | 269 @param params: Dictionary with test arguments |
275 """ | 270 """ |
276 super(KojiInstaller, self).__init__(test, params) | 271 super(KojiInstaller, self).__init__(test, params) |
277 | |
278 default_koji_cmd = '/usr/bin/koji' | 272 default_koji_cmd = '/usr/bin/koji' |
279 default_src_pkg = 'qemu' | 273 default_src_pkg = 'qemu' |
280 | |
281 self.koji_cmd = params.get("koji_cmd", default_koji_cmd) | |
282 self.src_pkg = params.get("src_pkg", default_src_pkg) | 274 self.src_pkg = params.get("src_pkg", default_src_pkg) |
283 | |
284 # Checking if all required dependencies are available | |
285 os_dep.command(self.koji_cmd) | |
286 | |
287 config_map = {'/usr/bin/koji': '/etc/koji.conf', | |
288 '/usr/bin/brew': '/etc/brewkoji.conf'} | |
289 config_file = config_map[self.koji_cmd] | |
290 base_name = os.path.basename(self.koji_cmd) | |
291 if os.access(config_file, os.F_OK): | |
292 f = open(config_file) | |
293 config = ConfigParser.ConfigParser() | |
294 config.readfp(f) | |
295 f.close() | |
296 else: | |
297 raise error.TestError('Configuration file %s missing or with wrong ' | |
298 'permissions' % config_file) | |
299 | |
300 if config.has_section(base_name): | |
301 self.koji_options = {} | |
302 session_options = {} | |
303 server = None | |
304 for name, value in config.items(base_name): | |
305 if name in ('user', 'password', 'debug_xmlrpc', 'debug'): | |
306 session_options[name] = value | |
307 self.koji_options[name] = value | |
308 self.session = koji.ClientSession(self.koji_options['server'], | |
309 session_options) | |
310 else: | |
311 raise error.TestError('Koji config file %s does not have a %s ' | |
312 'session' % (config_file, base_name)) | |
313 | |
314 self.tag = params.get("koji_tag", None) | 275 self.tag = params.get("koji_tag", None) |
315 self.build = params.get("koji_build", None) | 276 self.build = params.get("koji_build", None) |
316 if self.build and self.build.isdigit(): | 277 koji_cmd = params.get("koji_cmd", default_koji_cmd) |
317 self.build = int(self.build) | 278 self.downloader = kvm_utils.KojiDownloader(cmd=koji_cmd) |
318 if self.tag and self.build: | |
319 logging.info("Both tag and build parameters provided, ignoring tag " | |
320 "parameter...") | |
321 if not self.tag and not self.build: | |
322 raise error.TestError("Koji install selected but neither koji_tag " | |
323 "nor koji_build parameters provided. Please " | |
324 "provide an appropriate tag or build name.") | |
325 | 279 |
326 | 280 |
327 def _get_packages(self): | 281 def _get_packages(self): |
328 """ | 282 """ |
329 Downloads the specific arch RPMs for the specific build name. | 283 Downloads the specific arch RPMs for the specific build name. |
330 """ | 284 """ |
331 if self.build is None: | 285 self.downloader.get(src_package=self.src_pkg, tag=self.tag, |
332 try: | 286 build=self.build, dst_dir=self.srcdir) |
333 builds = self.session.listTagged(self.tag, latest=True, | |
334 package=self.src_pkg) | |
335 except koji.GenericError, e: | |
336 raise error.TestError("Error finding latest build for tag %s: " | |
337 "%s" % (self.tag, e)) | |
338 if not builds: | |
339 raise error.TestError("Tag %s has no builds of %s" % | |
340 (self.tag, self.src_pkg)) | |
341 info = builds[0] | |
342 else: | |
343 info = self.session.getBuild(self.build) | |
344 | |
345 if info is None: | |
346 raise error.TestError('No such brew/koji build: %s' % | |
347 self.build) | |
348 rpms = self.session.listRPMs(buildID=info['id'], | |
349 arches=utils.get_arch()) | |
350 if not rpms: | |
351 raise error.TestError("No %s packages available for %s" % | |
352 utils.get_arch(), koji.buildLabel(info)) | |
353 for rpm in rpms: | |
354 rpm_name = koji.pathinfo.rpm(rpm) | |
355 url = ("%s/%s/%s/%s/%s" % (self.koji_options['pkgurl'], | |
356 info['package_name'], | |
357 info['version'], info['release'], | |
358 rpm_name)) | |
359 utils.get_file(url, | |
360 os.path.join(self.srcdir, os.path.basename(url))) | |
361 | 287 |
362 | 288 |
363 def install(self): | 289 def install(self): |
364 super(KojiInstaller, self)._clean_previous_installs() | 290 super(KojiInstaller, self)._clean_previous_installs() |
365 self._get_packages() | 291 self._get_packages() |
366 super(KojiInstaller, self)._install_packages() | 292 super(KojiInstaller, self)._install_packages() |
367 create_symlinks(test_bindir=self.test_bindir, | 293 create_symlinks(test_bindir=self.test_bindir, |
368 bin_list=self.qemu_bin_paths) | 294 bin_list=self.qemu_bin_paths) |
369 if self.load_modules: | 295 if self.load_modules: |
370 load_kvm_modules(load_stock=True, extra_modules=self.extra_modules) | 296 load_kvm_modules(load_stock=True, extra_modules=self.extra_modules) |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 srcdir = params.get("srcdir", test.srcdir) | 599 srcdir = params.get("srcdir", test.srcdir) |
674 params["srcdir"] = srcdir | 600 params["srcdir"] = srcdir |
675 | 601 |
676 if install_mode in ['localsrc', 'localtar', 'release', 'snapshot']: | 602 if install_mode in ['localsrc', 'localtar', 'release', 'snapshot']: |
677 installer = SourceDirInstaller(test, params) | 603 installer = SourceDirInstaller(test, params) |
678 elif install_mode == 'git': | 604 elif install_mode == 'git': |
679 installer = GitInstaller(test, params) | 605 installer = GitInstaller(test, params) |
680 elif install_mode == 'yum': | 606 elif install_mode == 'yum': |
681 installer = YumInstaller(test, params) | 607 installer = YumInstaller(test, params) |
682 elif install_mode == 'koji': | 608 elif install_mode == 'koji': |
683 if KOJI_INSTALLED: | 609 installer = KojiInstaller(test, params) |
684 installer = KojiInstaller(test, params) | |
685 else: | |
686 raise error.TestError('Koji install selected but koji/brew are not ' | |
687 'installed') | |
688 else: | 610 else: |
689 raise error.TestError('Invalid or unsupported' | 611 raise error.TestError('Invalid or unsupported' |
690 ' install mode: %s' % install_mode) | 612 ' install mode: %s' % install_mode) |
691 | 613 |
692 installer.install() | 614 installer.install() |
OLD | NEW |