diff --git a/totest-manager.py b/totest-manager.py index c669ec79..2790d8fc 100755 --- a/totest-manager.py +++ b/totest-manager.py @@ -51,6 +51,12 @@ class NotFoundException(Exception): pass +class ImageProduct(object): + def __init__(self, package, archs): + self.package = package + self.archs = archs + + class ToTestBase(object): """Base class to store the basic interface""" @@ -58,7 +64,13 @@ class ToTestBase(object): product_repo = 'images' product_arch = 'local' livecd_repo = 'images' - livecd_archs = ['i586', 'x86_64'] + totest_container_repo = 'containers' + + main_products = [] + ftp_products = [] + container_products = [] + livecd_products = [] + image_products = [] def __init__(self, project, dryrun=False, norelease=False, api_url=None, openqa_server='https://openqa.opensuse.org', test_subproject=None): self.project = project @@ -103,8 +115,13 @@ class ToTestBase(object): def current_version(self): return self.release_version() - def binaries_of_product(self, project, product): - url = self.api.makeurl(['build', project, self.product_repo, self.product_arch, product]) + def binaries_of_product(self, project, product, repo=None, arch=None): + if repo is None: + repo = self.product_repo + if arch is None: + arch = self.product_arch + + url = self.api.makeurl(['build', project, repo, arch, product]) try: f = self.api.retried_GET(url) except HTTPError: @@ -137,10 +154,10 @@ class ToTestBase(object): return result.group(1) raise NotFoundException("can't find %s ftp version" % project) - def iso_build_version(self, project, tree, base=None): + def iso_build_version(self, project, tree, base=None, repo=None, arch=None): if not base: base = self.project_base - for binary in self.binaries_of_product(project, tree): + for binary in self.binaries_of_product(project, tree, repo=repo, arch=arch): result = re.match(r'.*-(?:Build|Snapshot)([0-9.]+)(?:-Media.*\.iso|\.docker\.tar\.xz)', binary) if result: return result.group(1) @@ -384,7 +401,7 @@ class ToTestBase(object): return None # docker container has no size limit - if re.match(r'opensuse-leap-image.*', package): + if re.match(r'opensuse-.*-image.*', package): return None if '-Addon-NonOss-ftp-ftp' in package: @@ -448,46 +465,69 @@ class ToTestBase(object): if not self.package_ok(self.project, product, self.product_repo, self.product_arch): return False + for product in self.image_products + self.container_products: + for arch in product.archs: + if not self.package_ok(self.project, product.package, self.product_repo, arch): + return False + if len(self.livecd_products): if not self.all_repos_done('%s:Live' % self.project): return False - for arch in self.livecd_archs: - for product in self.livecd_products: - if not self.package_ok('%s:Live' % self.project, product, self.livecd_repo, arch): + for product in self.livecd_products: + for arch in product.archs: + if not self.package_ok('%s:Live' % self.project, product.package, + self.product_repo, arch): return False return True - def _release_package(self, project, package, set_release=None): + def _release_package(self, project, package, set_release=None, repository=None, + target_project=None, target_repository=None): query = {'cmd': 'release'} if set_release: query['setrelease'] = set_release - # FIXME: make configurable. openSUSE:Factory:ARM currently has multiple - # repos with release targets, so obs needs to know which one to release - if project == 'openSUSE:Factory:ARM': - query['repository'] = 'images' + if repository is not None: + query['repository'] = repository + + if target_project is not None: + # Both need to be set + query['target_project'] = target_project + query['target_repository'] = target_repository baseurl = ['source', project, package] url = self.api.makeurl(baseurl, query=query) if self.dryrun or self.norelease: - logger.info("release %s/%s (%s)" % (project, package, set_release)) + logger.info("release %s/%s (%s)" % (project, package, query)) else: self.api.retried_POST(url) def _release(self, set_release=None): for product in self.ftp_products: - self._release_package(self.project, product) + self._release_package(self.project, product, repository=self.product_repo) for cd in self.livecd_products: self._release_package('%s:Live' % - self.project, cd, set_release=set_release) + self.project, cd.package, set_release=set_release, + repository=self.livecd_repo) + + for image in self.image_products: + self._release_package(self.project, image.package, set_release=set_release, + repository=self.product_repo) for cd in self.main_products: - self._release_package(self.project, cd, set_release=set_release) + self._release_package(self.project, cd, set_release=set_release, + repository=self.product_repo) + + for container in self.container_products: + # Containers are built in the same repo as other image products, + # but released into a different repo in :ToTest + self._release_package(self.project, container.package, repository=self.product_repo, + target_project=self.test_project, + target_repository=self.totest_container_repo) def update_totest(self, snapshot=None): release = 'Snapshot%s' % snapshot if snapshot else None @@ -501,7 +541,13 @@ class ToTestBase(object): logger.info('Publish test project content') if not (self.dryrun or self.norelease): self.api.switch_flag_in_prj( - self.test_project, flag='publish', state='enable') + self.test_project, flag='publish', state='enable', + repository=self.product_repo) + if self.container_products: + logger.info('Releasing container products from ToTest') + for container in self.container_products: + self._release_package(self.test_project, container.package, + repository=self.totest_container_repo) def totest_is_publishing(self): """Find out if the publishing flag is set in totest's _meta""" @@ -514,7 +560,9 @@ class ToTestBase(object): return True for flag in root.find('publish'): - if flag.get('repository', None) or flag.get('arch', None): + if flag.get('repository', None) not in [None, self.product_repo]: + continue + if flag.get('arch', None): continue if flag.tag == 'enable': return True @@ -658,7 +706,7 @@ class ToTestBaseNew(ToTestBase): # XXX still legacy for cd in self.livecd_products: self._release_package('%s:Live' % - self.project, cd, set_release=set_release) + self.project, cd.package, set_release=set_release) def release_version(self): url = self.api.makeurl(['build', self.project, 'standard', self.arch(), @@ -686,8 +734,12 @@ class ToTestBaseNew(ToTestBase): # XXX: don't care about nonoss atm. continue builds.add(self.ftp_build_version(self.project, p)) - for p in self.main_products + self.livecd_products: + for p in self.main_products: builds.add(self.iso_build_version(self.project, p)) + for p in self.livecd_products + self.image_products: + for arch in p.archs: + builds.add(self.iso_build_version(self.project, p.package, + arch=p.arch)) ret = (len(builds) == 1) if ret is False: @@ -712,9 +764,9 @@ class ToTestFactory(ToTestBase): ftp_products = ['000product:openSUSE-ftp-ftp-i586_x86_64', '000product:openSUSE-Addon-NonOss-ftp-ftp-i586_x86_64'] - livecd_products = ['livecd-tumbleweed-kde', - 'livecd-tumbleweed-gnome', - 'livecd-tumbleweed-x11'] + livecd_products = [ImageProduct('livecd-tumbleweed-kde', ['i586', 'x86_64']), + ImageProduct('livecd-tumbleweed-gnome', ['i586', 'x86_64']), + ImageProduct('livecd-tumbleweed-x11', ['i586', 'x86_64'])] def __init__(self, *args, **kwargs): ToTestBase.__init__(self, *args, **kwargs) @@ -735,8 +787,6 @@ class ToTestFactoryPowerPC(ToTestBase): ftp_products = ['000product:openSUSE-ftp-ftp-ppc64_ppc64le'] - livecd_products = [] - def __init__(self, *args, **kwargs): ToTestBase.__init__(self, *args, **kwargs) @@ -759,8 +809,6 @@ class ToTestFactoryzSystems(ToTestBase): ftp_products = ['000product:openSUSE-ftp-ftp-s390x'] - livecd_products = [] - def __init__(self, *args, **kwargs): ToTestBase.__init__(self, *args, **kwargs) @@ -786,8 +834,7 @@ class ToTestFactoryARM(ToTestFactory): '000product:openSUSE-ftp-ftp-armv7hl', '000product:openSUSE-ftp-ftp-armv6hl'] - livecd_products = ['JeOS'] - livecd_archs = ['armv7l'] + livecd_products = [ImageProduct('JeOS', ['armv7l'])] def __init__(self, *args, **kwargs): ToTestFactory.__init__(self, *args, **kwargs) @@ -812,8 +859,6 @@ class ToTest151(ToTestBaseNew): '000product:openSUSE-Addon-NonOss-ftp-ftp-x86_64' ] - livecd_products = [] - def openqa_group(self): return 'openSUSE Leap 15' @@ -831,8 +876,7 @@ class ToTest151ARM(ToTest151): '000product:openSUSE-ftp-ftp-armv7hl', ] - livecd_products = ['JeOS'] - livecd_archs = ['armv7l'] + livecd_products = [ImageProduct('JeOS', ['armv7l'])] # Leap 15.1 ARM still need to update snapshot set_snapshot_number = True @@ -856,8 +900,6 @@ class ToTest150Ports(ToTestBaseNew): '000product:openSUSE-ftp-ftp-armv7hl', ] - livecd_products = [] - # Leap 15.0 Ports still need to update snapshot set_snapshot_number = True @@ -877,24 +919,19 @@ class ToTest150Ports(ToTestBaseNew): class ToTest150Images(ToTestBaseNew): - main_products = [ - 'livecd-leap-gnome', - 'livecd-leap-kde', - 'livecd-leap-x11', - 'opensuse-leap-image:docker', - 'opensuse-leap-image:lxc', - 'kiwi-templates-Leap15-JeOS:MS-HyperV', - 'kiwi-templates-Leap15-JeOS:OpenStack-Cloud', - 'kiwi-templates-Leap15-JeOS:VMware', - 'kiwi-templates-Leap15-JeOS:XEN', - 'kiwi-templates-Leap15-JeOS:kvm-and-xen', + image_products = [ + ImageProduct('livecd-leap-gnome', ['x86_64']), + ImageProduct('livecd-leap-kde', ['x86_64']), + ImageProduct('livecd-leap-x11', ['x86_64']), + ImageProduct('opensuse-leap-image:docker', ['x86_64']), + ImageProduct('opensuse-leap-image:lxc', ['x86_64']), + ImageProduct('kiwi-templates-Leap15-JeOS:MS-HyperV', ['x86_64']), + ImageProduct('kiwi-templates-Leap15-JeOS:OpenStack-Cloud', ['x86_64']), + ImageProduct('kiwi-templates-Leap15-JeOS:VMware', ['x86_64']), + ImageProduct('kiwi-templates-Leap15-JeOS:XEN', ['x86_64']), + ImageProduct('kiwi-templates-Leap15-JeOS:kvm-and-xen', ['x86_64']), ] - ftp_products = [] - - livecd_products = [] - product_arch = 'x86_64' - # docker image has a different number need_same_build_number = False set_snapshot_number = True @@ -908,8 +945,13 @@ class ToTest150Images(ToTestBaseNew): def write_version_to_dashboard(self, target, version): super(ToTest150Images, self).write_version_to_dashboard('{}_images'.format(target), version) + def current_version(self): + return self.iso_build_version(self.project, self.image_products[0].package, + arch=self.image_products[0].archs[0]) + def get_current_snapshot(self): - return self.iso_build_version(self.project + ':ToTest', self.main_products[0]) + return self.iso_build_version(self.project + ':ToTest', self.image_products[0].package, + arch=self.image_products[0].archs[0]) def _release(self, set_release=None): ToTestBase._release(self, set_release) @@ -918,6 +960,7 @@ class ToTest150Images(ToTestBaseNew): return 13 class ToTest151Images(ToTest150Images): + container_products = [ImageProduct('opensuse-leap-image:docker', ['x86_64'])] def openqa_group(self): return 'openSUSE Leap 15.1 Images' @@ -954,8 +997,6 @@ class ToTestSLE12(ToTestSLE): '_product:SLES-ftp-POOL-x86_64', ] - livecd_products = [] - class ToTestSLE15(ToTestSLE): main_products = [ '000product:SLES-cd-DVD-aarch64', @@ -971,8 +1012,6 @@ class ToTestSLE15(ToTestSLE): '000product:SLES-ftp-POOL-x86_64', ] - livecd_products = [] - class CommandlineInterface(cmdln.Cmdln):