Fix and test repository_path_expand on SLE12-SP5

The way OBS collapses repositories is different to what we did
This commit is contained in:
Stephan Kulow
2019-05-11 15:52:20 +02:00
parent fbd1bbd4e2
commit 4db9df6aec
17 changed files with 294 additions and 18 deletions

View File

@@ -1,4 +1,5 @@
from collections import namedtuple
from collections import OrderedDict
from datetime import datetime
from dateutil.parser import parse as date_parse
import re
@@ -351,28 +352,31 @@ def attribute_value_save(apiurl, project, name, value, namespace='OSRT'):
http_POST(url, data=ET.tostring(root))
@memoize(session=True)
def repository_path_expand(apiurl, project, repo, repos=None):
def _repository_path_expand(apiurl, project, repo, repos):
"""Recursively list underlying projects."""
if repos is None:
# Avoids screwy behavior where list as default shares reference for all
# calls which effectively means the list grows even when new project.
repos = []
# only the last repo for a project is remembered by OBS
if project in repos:
del repos[project]
if [project, repo] in repos:
# For some reason devel projects such as graphics include the same path
# twice for openSUSE:Factory/snapshot. Does not hurt anything, but
# cleaner not to include it twice.
return repos
repos.append([project, repo])
repos[project] = repo
meta = ET.fromstringlist(show_project_meta(apiurl, project))
for path in meta.findall('.//repository[@name="{}"]/path'.format(repo)):
repository_path_expand(apiurl, path.get('project', project), path.get('repository'), repos)
_repository_path_expand(apiurl, path.get('project', project), path.get('repository'), repos)
return repos
@memoize(session=True)
def repository_path_expand(apiurl, project, repo):
"""Recursively list underlying projects."""
repodict = OrderedDict()
_repository_path_expand(apiurl, project, repo, repodict)
repos = []
for project, repo in repodict.items():
repos.append([project, repo])
return repos
@memoize(session=True)
def repository_path_search(apiurl, project, search_project, search_repository):
queue = []

View File

@@ -342,13 +342,15 @@ class Project(object):
for link in project_links:
ET.SubElement(root, 'link', { 'project': link })
url = osc.core.make_meta_url('prj', self.name, APIURL)
osc.core.http_PUT(url, data=ET.tostring(root))
self.custom_meta(ET.tostring(root))
def add_package(self, package):
self.packages.append(package)
def custom_meta(self, meta):
url = osc.core.make_meta_url('prj', self.name, APIURL)
osc.core.http_PUT(url, data=meta)
def remove(self):
if not self.name:
return
@@ -356,7 +358,7 @@ class Project(object):
for package in self.packages:
package.remove()
url = osc.core.makeurl(APIURL, ['source', self.name])
url = osc.core.makeurl(APIURL, ['source', self.name], {'force': 1})
try:
osc.core.http_DELETE(url)
except HTTPError:

View File

@@ -0,0 +1,12 @@
<project name="SUSE:SLE-12-SP1:GA">
<title/>
<description/>
<link project="SUSE:SLE-12:Update"/>
<repository name="standard">
<path project="SUSE:SLE-12:Update" repository="snapshot-SP1"/>
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,30 @@
<project name="SUSE:SLE-12-SP1:Update" kind="maintenance_release">
<title>SLE 12 SP1 Updates</title>
<description/>
<link project="SUSE:SLE-12-SP1:GA" vrevmode="extend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP1:GA" repository="standard"/>
<path project="SUSE:SLE-12:Update" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP5">
<path project="SUSE:SLE-12-SP1:GA" repository="standard"/>
<path project="SUSE:SLE-12:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP4">
<path project="SUSE:SLE-12-SP1:GA" repository="standard"/>
<path project="SUSE:SLE-12:Update" repository="snapshot-SP4"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP3">
<path project="SUSE:SLE-12-SP1:GA" repository="standard"/>
<path project="SUSE:SLE-12:Update" repository="snapshot-SP3"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP2">
<path project="SUSE:SLE-12-SP1:GA" repository="standard"/>
<path project="SUSE:SLE-12:Update" repository="snapshot-SP2"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -0,0 +1,12 @@
<project name="SUSE:SLE-12-SP2:GA">
<title/>
<description/>
<link project="SUSE:SLE-12-SP1:Update" vrevmode="unextend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP1:Update" repository="snapshot-SP2"/>
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,25 @@
<project name="SUSE:SLE-12-SP2:Update" kind="maintenance_release">
<title>SLE 12 SP2 Updates</title>
<description/>
<link project="SUSE:SLE-12-SP2:GA" vrevmode="extend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP2:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP1:Update" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP5">
<path project="SUSE:SLE-12-SP2:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP1:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP4">
<path project="SUSE:SLE-12-SP2:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP1:Update" repository="snapshot-SP4"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP3">
<path project="SUSE:SLE-12-SP2:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP1:Update" repository="snapshot-SP3"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -0,0 +1,12 @@
<project name="SUSE:SLE-12-SP3:GA">
<title/>
<description/>
<link project="SUSE:SLE-12-SP2:Update" vrevmode="unextend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP2:Update" repository="snapshot-SP3"/>
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,20 @@
<project name="SUSE:SLE-12-SP3:Update" kind="maintenance_release">
<title>SLE 12 SP3 Updates</title>
<description/>
<link project="SUSE:SLE-12-SP3:GA" vrevmode="extend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP3:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP2:Update" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP5">
<path project="SUSE:SLE-12-SP3:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP2:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP4">
<path project="SUSE:SLE-12-SP3:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP2:Update" repository="snapshot-SP4"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -0,0 +1,12 @@
<project name="SUSE:SLE-12-SP4:GA">
<title/>
<description/>
<link project="SUSE:SLE-12-SP3:Update" vrevmode="unextend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP3:Update" repository="snapshot-SP4"/>
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,15 @@
<project name="SUSE:SLE-12-SP4:Update" kind="maintenance_release">
<title>SLE 12 SP4 Updates</title>
<description/>
<link project="SUSE:SLE-12-SP4:GA" vrevmode="extend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP4:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP3:Update" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP5">
<path project="SUSE:SLE-12-SP4:GA" repository="standard"/>
<path project="SUSE:SLE-12-SP3:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -0,0 +1,12 @@
<project name="SUSE:SLE-12-SP5:GA">
<title/>
<description/>
<link project="SUSE:SLE-12-SP4:Update" vrevmode="unextend"/>
<repository name="standard">
<path project="SUSE:SLE-12-SP4:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,10 @@
<project name="SUSE:SLE-12-SP5:GA:Staging:A">
<title/>
<description/>
<link project="SUSE:SLE-12-SP5:GA"/>
<repository name="standard" linkedbuild="all">
<path project="SUSE:SLE-12-SP5:GA" repository="ports"/>
<path project="SUSE:SLE-12-SP4:Update" repository="snapshot-SP5"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -0,0 +1,11 @@
<project name="SUSE:SLE-12:GA">
<title>Code 12 SP0 GA platform</title>
<description>The SLE-12 GA Sources.</description>
<repository name="standard">
<arch>x86_64</arch>
</repository>
<repository name="ports">
<arch>armv7l</arch>
</repository>
</project>

View File

@@ -0,0 +1,30 @@
<project name="SUSE:SLE-12:Update" kind="maintenance_release">
<title>SLE 12 SP0 Updates</title>
<description/>
<link project="SUSE:SLE-12:GA" vrevmode="extend"/>
<repository name="standard">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP5">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP4">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP3">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP2">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
<repository name="snapshot-SP1">
<path project="SUSE:SLE-12:GA" repository="standard"/>
<arch>x86_64</arch>
</repository>
</project>

View File

@@ -1,2 +1,6 @@
[global]
[general]
apiurl = http://api:3000
[http://api:3000]
user=Admin
pass=opensuse

64
tests/repository_tests.py Normal file
View File

@@ -0,0 +1,64 @@
import unittest
import os
import os.path
from osclib.core import repository_path_expand
from . import OBSLocal
FIXTURES = os.path.join(os.getcwd(), 'tests/fixtures/repository')
class TestRepository(unittest.TestCase):
def setUp(self):
super(TestRepository, self).setUp()
self.wf = OBSLocal.StagingWorkflow()
def tearDown(self):
del self.wf
super(TestRepository, self).tearDown()
def add_project(self, name):
prj = self.wf.create_project(name)
with open(os.path.join(FIXTURES, name + '.xml')) as f:
prj.custom_meta(f.read())
def test_sp5_setup(self):
self.add_project('SUSE:SLE-12:GA')
self.add_project('SUSE:SLE-12:Update')
self.add_project('SUSE:SLE-12-SP1:GA')
self.add_project('SUSE:SLE-12-SP1:Update')
self.add_project('SUSE:SLE-12-SP2:GA')
self.add_project('SUSE:SLE-12-SP2:Update')
self.add_project('SUSE:SLE-12-SP3:GA')
self.add_project('SUSE:SLE-12-SP3:Update')
self.add_project('SUSE:SLE-12-SP4:GA')
self.add_project('SUSE:SLE-12-SP4:Update')
self.add_project('SUSE:SLE-12-SP5:GA')
self.add_project('SUSE:SLE-12-SP5:GA:Staging:A')
repos = repository_path_expand(self.wf.api.apiurl, 'SUSE:SLE-12-SP5:GA', 'standard')
self.assertEqual([['SUSE:SLE-12-SP5:GA', 'standard'],
['SUSE:SLE-12-SP4:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP4:GA', 'standard'],
['SUSE:SLE-12-SP3:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP3:GA', 'standard'],
['SUSE:SLE-12-SP2:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP2:GA', 'standard'],
['SUSE:SLE-12-SP1:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP1:GA', 'standard'],
['SUSE:SLE-12:Update', 'snapshot-SP5'],
['SUSE:SLE-12:GA', 'standard']], repos)
repos = repository_path_expand(self.wf.api.apiurl, 'SUSE:SLE-12-SP5:GA:Staging:A', 'standard')
self.assertEqual([['SUSE:SLE-12-SP5:GA:Staging:A', 'standard'],
['SUSE:SLE-12-SP5:GA', 'ports'],
['SUSE:SLE-12-SP4:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP4:GA', 'standard'],
['SUSE:SLE-12-SP3:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP3:GA', 'standard'],
['SUSE:SLE-12-SP2:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP2:GA', 'standard'],
['SUSE:SLE-12-SP1:Update', 'snapshot-SP5'],
['SUSE:SLE-12-SP1:GA', 'standard'],
['SUSE:SLE-12:Update', 'snapshot-SP5'],
['SUSE:SLE-12:GA', 'standard']], repos)

View File

@@ -19,6 +19,7 @@ from . import OBSLocal
class TestSelect(unittest.TestCase):
def setUp(self):
super(TestSelect, self).setUp()
self.wf = OBSLocal.StagingWorkflow()
def tearDown(self):