diff --git a/osclib/accept_command.py b/osclib/accept_command.py index 8735f568..1ffd5f5e 100644 --- a/osclib/accept_command.py +++ b/osclib/accept_command.py @@ -97,8 +97,7 @@ class AcceptCommand(object): u = self.api.makeurl(['staging', self.api.project, 'staging_projects', project, 'accept']) f = http_POST(u) - while True: - print(self.api.project_status(project, reload=True).get('state')) + while self.api.project_status(project, reload=True, requests=False).get('state') != 'empty': time.sleep(1) self.api.staging_deactivate(project) diff --git a/osclib/select_command.py b/osclib/select_command.py index c6da7a6a..7c0c686f 100644 --- a/osclib/select_command.py +++ b/osclib/select_command.py @@ -48,16 +48,14 @@ class SelectCommand(object): package = self._package(request) candidates = [] # Store candidates to be supersede by 'request' - for staging in self.api.get_staging_projects(): - # requests for the same project are fine - if staging == self.target_project: - continue - pstatus = self.api.project_status(staging) - for rq in pstatus.findall('selected_requests/entry'): - if int(rq.get('id')) < int(request) and rq.get('package') == package: - candidates.append((rq.get('id'), package, staging)) + url = self.api.makeurl(['staging', self.api.project, 'staging_projects'], { 'requests': 1 }) + status = ET.parse(self.api.retried_GET(url)).getroot() + for prj in status.findall('staging_project'): + for req in prj.findall('./staged_requests/request'): + if int(req.get('id')) < int(request) and req.get('package') == package: + candidates.append((req.get('id'), package, prj.get('name'))) - assert len(candidates) <= 1, 'There are more thant one candidate to supersede {} ({}): {}'.format(request, package, candidates) + assert len(candidates) <= 1, 'There are more than one candidate to supersede {} ({}): {}'.format(request, package, candidates) return candidates[0] if candidates else None diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index bf02aaa7..2e229e70 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -229,12 +229,11 @@ class StagingAPI(object): """ packages_staged = {} - for prj in self.get_staging_projects(): - status = self.project_status(prj) - if status is None: - continue - for req in status.findall('staged_requests/request'): - packages_staged[req.get('package')] = {'prj': prj, 'rq_id': req.get('id')} + url = self.makeurl(['staging', self.project, 'staging_projects'], { 'requests': 1 }) + status = ET.parse(self.retried_GET(url)).getroot() + for prj in status.findall('staging_project'): + for req in prj.findall('./staged_requests/request'): + packages_staged[req.get('package')] = {'prj': prj.get('name'), 'rq_id': req.get('id')} return packages_staged @@ -310,7 +309,8 @@ class StagingAPI(object): """ result = [] - status = self.staging_status() + url = self.makeurl(['staging', self.project, 'staging_projects']) + status = ET.parse(self.retried_GET(url)).getroot() for project in status.findall('staging_project'): result.append(project.get('name')) return result @@ -681,7 +681,8 @@ class StagingAPI(object): :param project: project the package is in :param package: package we want to query for """ - data = self.project_status(project) + logging.error('get_request_id_for_package') + data = self.project_status(project, status=False) for x in data.findall('staged_requests/request'): if x.get('package') == package: return int(x.get('id')) @@ -693,7 +694,8 @@ class StagingAPI(object): :param project: project the package is in :param package: package we want to query for """ - data = self.project_status(project) + logging.error('get_package_for_request_id') + data = self.project_status(project, status=False) request_id = str(request_id) for x in data.findall('staged_requests/request'): if x.get('id') == request_id: @@ -874,24 +876,19 @@ class StagingAPI(object): return log.getvalue() - @memoize(session=True) - def staging_status(self): - url = self.makeurl(['staging', self.project, 'staging_projects']) - return ET.parse(self.retried_GET(url)).getroot() - - def project_status(self, staging, reload=False): + def project_status(self, staging, status=True, requests=True, reload=False): if not staging: raise oscerr.WrongArgs('No staging given') - if reload: - url = self.makeurl(['staging', self.project, 'staging_projects', staging]) - return ET.parse(self.retried_GET(url)).getroot() - - root = self.staging_status() - staging = self.prj_from_short(staging) - for project in root.findall('staging_project[@name="{}"]'.format(staging)): - return project - return None + import traceback + traceback.print_stack() + opts = {} + if requests: + opts['requests'] = 1 + if status: + opts['status'] = 1 + url = self.makeurl(['staging', self.project, 'staging_projects', staging], opts) + return ET.parse(self.retried_GET(url)).getroot() def check_project_status(self, project): """ @@ -901,7 +898,7 @@ class StagingAPI(object): informations) """ - return self.project_status(project).get('state') == 'acceptable' + return self.project_status(project, requests=False).get('state') == 'acceptable' def project_status_build_percent(self, status): final, tobuild = self.project_status_build_sum(status)