Try to implement more package handling
This commit is contained in:
parent
da70085a34
commit
37eab408ed
98
tests/obs.py
98
tests/obs.py
@ -9,6 +9,7 @@ import sys
|
|||||||
import httpretty
|
import httpretty
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
import time
|
import time
|
||||||
|
import types
|
||||||
|
|
||||||
from string import Template
|
from string import Template
|
||||||
import oscs
|
import oscs
|
||||||
@ -81,10 +82,20 @@ class OBS(object):
|
|||||||
'prj': 'openSUSE:Factory:Staging:B', 'pkg': 'wine', 'devprj': 'home:Admin'
|
'prj': 'openSUSE:Factory:Staging:B', 'pkg': 'wine', 'devprj': 'home:Admin'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.meta_data = {
|
||||||
|
}
|
||||||
self.pkg_data = {
|
self.pkg_data = {
|
||||||
'home:Admin/gcc': {'rev': '1', 'vrev': '1', 'name': 'gcc',
|
'home:Admin/gcc': {'rev': '1', 'vrev': '1', 'name': 'gcc',
|
||||||
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
||||||
'home:Admin/wine': {'rev': '1', 'vrev': '1', 'name': 'wine',
|
'home:Admin/wine': {'rev': '1', 'vrev': '1', 'name': 'wine',
|
||||||
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
||||||
|
'openSUSE:Factory/gcc': {'rev': '1', 'vrev': '1', 'name': 'gcc',
|
||||||
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
||||||
|
'openSUSE:Factory/wine': {'rev': '1', 'vrev': '1', 'name': 'wine',
|
||||||
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
||||||
|
'openSUSE:Factory:Rings:0-Bootstrap/elem-ring0': {'rev': '1', 'vrev': '1', 'name': 'elem-ring0',
|
||||||
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'},
|
||||||
|
'openSUSE:Factory/binutils': {'rev': '1', 'vrev': '1', 'name': 'wine',
|
||||||
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'}
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,6 +117,10 @@ class OBS(object):
|
|||||||
self._pkg_sources()
|
self._pkg_sources()
|
||||||
# Build results
|
# Build results
|
||||||
self._build_results()
|
self._build_results()
|
||||||
|
# List factory
|
||||||
|
self._factory_list()
|
||||||
|
# Project freeze
|
||||||
|
self._project_freeze()
|
||||||
# Workaround
|
# Workaround
|
||||||
self._ugly_hack()
|
self._ugly_hack()
|
||||||
|
|
||||||
@ -132,28 +147,33 @@ class OBS(object):
|
|||||||
reply = self.responses[request.method][path]
|
reply = self.responses[request.method][path]
|
||||||
# We have something to reply with
|
# We have something to reply with
|
||||||
if reply:
|
if reply:
|
||||||
|
def get_reply(reply):
|
||||||
# It's a dict, therefore there is return code as well
|
# It's a dict, therefore there is return code as well
|
||||||
if isinstance(reply, dict):
|
if isinstance(reply, dict):
|
||||||
ret_code = reply['status']
|
ret_code = reply['status']
|
||||||
reply = reply['reply']
|
reply = get_reply(reply['reply'])
|
||||||
else:
|
if isinstance(reply, list):
|
||||||
ret_code = 200
|
reply[0] = ret_code
|
||||||
|
return reply
|
||||||
# It's a list, so take the first
|
# It's a list, so take the first
|
||||||
if isinstance(reply, list):
|
if isinstance(reply, list):
|
||||||
reply = reply.pop(0)
|
return get_reply(reply.pop(0))
|
||||||
# It's string
|
# It's string
|
||||||
if isinstance(reply, string_types):
|
if isinstance(reply, string_types):
|
||||||
# It's XML
|
# It's XML
|
||||||
if reply.startswith('<'):
|
if reply.startswith('<'):
|
||||||
return (ret_code, headers, reply)
|
return (200, headers, reply)
|
||||||
# It's fixture
|
# It's fixture
|
||||||
else:
|
else:
|
||||||
return (ret_code, headers, self._get_fixture_content(reply))
|
return (200, headers, self._get_fixture_content(reply))
|
||||||
# All is left is callback function
|
# All is left is callback function
|
||||||
else:
|
if callable(reply):
|
||||||
return (ret_code, headers, reply(self.responses, request, uri))
|
return get_reply(reply(self.responses, request, uri))
|
||||||
|
return None
|
||||||
|
reply = get_reply(reply)
|
||||||
|
if reply:
|
||||||
|
return reply
|
||||||
# No possible response found
|
# No possible response found
|
||||||
else:
|
|
||||||
if len(path) == 0:
|
if len(path) == 0:
|
||||||
path = uri
|
path = uri
|
||||||
if len(path) > 1:
|
if len(path) > 1:
|
||||||
@ -213,6 +233,26 @@ class OBS(object):
|
|||||||
self.responses['GET']['/build/openSUSE:Factory:Staging:A/_result'] = build_results
|
self.responses['GET']['/build/openSUSE:Factory:Staging:A/_result'] = build_results
|
||||||
self.responses['GET']['/build/openSUSE:Factory:Staging:B/_result'] = build_results
|
self.responses['GET']['/build/openSUSE:Factory:Staging:B/_result'] = build_results
|
||||||
|
|
||||||
|
def _factory_list(self):
|
||||||
|
def factory_list(responses, request, uri):
|
||||||
|
if 'nofilename' in request.querystring and '1' in request.querystring['nofilename'] and 'view' in request.querystring and 'info' in request.querystring['view']:
|
||||||
|
ret = '<sourceinfolist>\n'
|
||||||
|
for pkg in self.pkg_data:
|
||||||
|
if re.match(r'openSUSE:Factory/', pkg):
|
||||||
|
ret += ' <sourceinfo package="{0}" rev="{1}" vrev="{2}" srcmd5="{3}" verifymd5="{3}" />'.format(self.pkg_data[pkg]['name'], self.pkg_data[pkg]['rev'], self.pkg_data[pkg]['vrev'], self.pkg_data[pkg]['srcmd5'])
|
||||||
|
ret += '</sourceinfolist>\n'
|
||||||
|
return ret
|
||||||
|
else:
|
||||||
|
raise BaseException("No response for {}".format(uri))
|
||||||
|
self.responses['GET']['/source/openSUSE:Factory'] = factory_list
|
||||||
|
|
||||||
|
def _project_freeze(self):
|
||||||
|
# FIXME: Actually do what is supposed to happen
|
||||||
|
def project_freeze(responses, request, uri):
|
||||||
|
return "<result>Ok</result>"
|
||||||
|
for pr in self.st_project_data:
|
||||||
|
self.responses['PUT']['/source/openSUSE:Factory:Staging:' + pr + '/_project/_frozenlinks'] = project_freeze
|
||||||
|
|
||||||
def _project_meta(self):
|
def _project_meta(self):
|
||||||
# Load template
|
# Load template
|
||||||
tmpl = Template(self._get_fixture_content('staging-project-meta.xml'))
|
tmpl = Template(self._get_fixture_content('staging-project-meta.xml'))
|
||||||
@ -267,15 +307,43 @@ class OBS(object):
|
|||||||
|
|
||||||
def _pkg_sources(self):
|
def _pkg_sources(self):
|
||||||
def pkg_source(responses, request, uri):
|
def pkg_source(responses, request, uri):
|
||||||
key = re.match(r'.*/source/([^?]+)(\?.*)?', uri).group(1)
|
match = re.match(r'.*/source/([^/]+)/([^?/]+)([/?].*)?', request.path)
|
||||||
|
if not match:
|
||||||
|
return { 'status': 404, 'reply': '<result>Not found</result>' }
|
||||||
|
key = match.group(1) + '/' + match.group(2)
|
||||||
|
if match.group(3) == '/_meta':
|
||||||
|
return self.meta_data[key]
|
||||||
|
if key in self.pkg_data:
|
||||||
|
if not self.pkg_data[key]:
|
||||||
|
return { 'status': 404, 'reply': '<result>Not found</result>' }
|
||||||
return '<directory name="{}" rev="{}" vrev="{}" srcmd5="{}"/>'.format(
|
return '<directory name="{}" rev="{}" vrev="{}" srcmd5="{}"/>'.format(
|
||||||
self.pkg_data[key]['name'],
|
self.pkg_data[key]['name'],
|
||||||
self.pkg_data[key]['rev'],
|
self.pkg_data[key]['rev'],
|
||||||
self.pkg_data[key]['vrev'],
|
self.pkg_data[key]['vrev'],
|
||||||
self.pkg_data[key]['srcmd5']
|
self.pkg_data[key]['srcmd5']
|
||||||
)
|
)
|
||||||
for pkg in self.pkg_data:
|
return { 'status': 404, 'reply': '<result>Not found</result>' }
|
||||||
self.responses['GET']['/source/' + pkg] = pkg_source
|
|
||||||
|
def pkg_change(responses, request, uri):
|
||||||
|
match = re.match(r'.*/source/([^/]+)/([^?/]+)([/?].*)?', request.path)
|
||||||
|
key = match.group(1) + '/' + match.group(2)
|
||||||
|
if match.group(3) == '/_meta':
|
||||||
|
self.meta_data[key] = request.body
|
||||||
|
return request.body
|
||||||
|
if match.group(3) == '/_aggregate':
|
||||||
|
xml = ET.fromstring(str(request.body))
|
||||||
|
element = xml.findall('aggregate')[0]
|
||||||
|
dev_prj = element.get('project')
|
||||||
|
# FIXME get data from linked project
|
||||||
|
self.pkg_data[key] = {
|
||||||
|
'rev': '1', 'vrev': '1', 'name': match.group(2),
|
||||||
|
'srcmd5': 'de7a9f5e3bedb01980465f3be3d236cb'
|
||||||
|
}
|
||||||
|
return request.body
|
||||||
|
return "<result>Ok</result>"
|
||||||
|
|
||||||
|
self.responses['GET']['/source'] = pkg_source
|
||||||
|
self.responses['PUT']['/source'] = pkg_change
|
||||||
|
|
||||||
def _link_sources(self):
|
def _link_sources(self):
|
||||||
# Load template
|
# Load template
|
||||||
@ -285,12 +353,12 @@ class OBS(object):
|
|||||||
key = re.match(r'.*/source/([^?]+)(\?.*)?', uri).group(1)
|
key = re.match(r'.*/source/([^?]+)(\?.*)?', uri).group(1)
|
||||||
del self.responses['GET']['/source/' + str(key)]
|
del self.responses['GET']['/source/' + str(key)]
|
||||||
del self.links_data[str(key)]
|
del self.links_data[str(key)]
|
||||||
return "Ok"
|
return "<result>Ok</result>"
|
||||||
|
|
||||||
def create_empty(responses, request, uri):
|
def create_empty(responses, request, uri):
|
||||||
key = re.match(r'.*/source/(.+)/_meta', uri).group(1)
|
key = re.match(r'.*/source/(.+)/_meta', uri).group(1)
|
||||||
self.links_data[str(key)] = {}
|
self.links_data[str(key)] = {}
|
||||||
return "Ok"
|
return "<result>Ok</result>"
|
||||||
|
|
||||||
def create_link(responses, request, uri):
|
def create_link(responses, request, uri):
|
||||||
tmpl = Template(self._get_fixture_content('linksource.xml'))
|
tmpl = Template(self._get_fixture_content('linksource.xml'))
|
||||||
@ -304,7 +372,7 @@ class OBS(object):
|
|||||||
}
|
}
|
||||||
self.responses['GET']['/source/' + key] = tmpl.substitute(self.links_data[key])
|
self.responses['GET']['/source/' + key] = tmpl.substitute(self.links_data[key])
|
||||||
self.responses['DELETE']['/source/' + key] = delete_link
|
self.responses['DELETE']['/source/' + key] = delete_link
|
||||||
return "Ok"
|
return "<result>Ok</result>"
|
||||||
|
|
||||||
# Register methods for requests
|
# Register methods for requests
|
||||||
for link in self.links_data:
|
for link in self.links_data:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user