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,11 +82,21 @@ 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'} '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'}
} }
def _clear_responses(self): def _clear_responses(self):
@ -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,38 +147,43 @@ 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:
# It's a dict, therefore there is return code as well def get_reply(reply):
if isinstance(reply, dict): # It's a dict, therefore there is return code as well
ret_code = reply['status'] if isinstance(reply, dict):
reply = reply['reply'] ret_code = reply['status']
else: reply = get_reply(reply['reply'])
ret_code = 200 if isinstance(reply, list):
# It's a list, so take the first reply[0] = ret_code
if isinstance(reply, list): return reply
reply = reply.pop(0) # It's a list, so take the first
# It's string if isinstance(reply, list):
if isinstance(reply, string_types): return get_reply(reply.pop(0))
# It's XML # It's string
if reply.startswith('<'): if isinstance(reply, string_types):
return (ret_code, headers, reply) # It's XML
# It's fixture if reply.startswith('<'):
else: return (200, headers, reply)
return (ret_code, headers, self._get_fixture_content(reply)) # It's fixture
# All is left is callback function else:
else: return (200, headers, self._get_fixture_content(reply))
return (ret_code, headers, reply(self.responses, request, uri)) # All is left is callback function
# No possible response found if callable(reply):
else: return get_reply(reply(self.responses, request, uri))
if len(path) == 0:
path = uri
if len(path) > 1:
ret = self._pretty_callback(request, 'https://localhost' + posixpath.dirname(path), headers, False)
if ret:
return ret
if exception:
raise BaseException("No response for {} on {} provided".format(request.method, uri))
else:
return None return None
reply = get_reply(reply)
if reply:
return reply
# No possible response found
if len(path) == 0:
path = uri
if len(path) > 1:
ret = self._pretty_callback(request, 'https://localhost' + posixpath.dirname(path), headers, False)
if ret:
return ret
if exception:
raise BaseException("No response for {} on {} provided".format(request.method, uri))
else:
return None
def _ugly_hack(self): def _ugly_hack(self):
""" """
@ -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)
return '<directory name="{}" rev="{}" vrev="{}" srcmd5="{}"/>'.format( if not match:
self.pkg_data[key]['name'], return { 'status': 404, 'reply': '<result>Not found</result>' }
self.pkg_data[key]['rev'], key = match.group(1) + '/' + match.group(2)
self.pkg_data[key]['vrev'], if match.group(3) == '/_meta':
self.pkg_data[key]['srcmd5'] return self.meta_data[key]
) if key in self.pkg_data:
for pkg in self.pkg_data: if not self.pkg_data[key]:
self.responses['GET']['/source/' + pkg] = pkg_source return { 'status': 404, 'reply': '<result>Not found</result>' }
return '<directory name="{}" rev="{}" vrev="{}" srcmd5="{}"/>'.format(
self.pkg_data[key]['name'],
self.pkg_data[key]['rev'],
self.pkg_data[key]['vrev'],
self.pkg_data[key]['srcmd5']
)
return { 'status': 404, 'reply': '<result>Not found</result>' }
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: