Merge pull request #1751 from Vogtinator/totestcontainer

Add release workflow for container products
This commit is contained in:
Stephan Kulow 2018-11-16 11:12:31 +01:00 committed by GitHub
commit e3f260fa16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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