| 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 |