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