Try to implement more package handling

This commit is contained in:
Michal Hrusecky 2014-03-07 13:58:33 +01:00 committed by Michal Hrusecky
parent da70085a34
commit 37eab408ed

View File

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