From 63ccac76d517ba929d1ba8a41bb0cb9a4b9f461b Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Wed, 9 Oct 2019 11:10:08 +0200 Subject: [PATCH] Work on accept command - not yet done --- osclib/accept_command.py | 48 ++++++++++++++++++++++------------------ osclib/request_finder.py | 21 ++++++++++++------ osclib/stagingapi.py | 14 +++++++----- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/osclib/accept_command.py b/osclib/accept_command.py index 8a9f5c97..eab86b27 100644 --- a/osclib/accept_command.py +++ b/osclib/accept_command.py @@ -1,10 +1,7 @@ import re +import time -try: - from urllib.error import HTTPError -except ImportError: - #python 2.x - from urllib2 import HTTPError +from urllib.error import HTTPError import warnings from xml.etree import cElementTree as ET @@ -12,11 +9,13 @@ from xml.etree import cElementTree as ET from osc.core import change_request_state, show_package_meta, wipebinaries from osc.core import http_GET, http_PUT, http_DELETE, http_POST from osc.core import delete_package, search, set_devel_project +from osc.core import Request from osc.util.helper import decode_it from osclib.core import attribute_value_save from osclib.core import attribute_value_load from osclib.core import source_file_load from osclib.core import source_file_save +from osclib.request_finder import RequestFinder from datetime import date @@ -64,7 +63,7 @@ class AcceptCommand(object): def perform(self, project, force=False): """Accept the staging project for review and submit to Factory / - openSUSE 13.2 ... + Leap ... Then disable the build to disabled :param project: staging project we are working with @@ -78,25 +77,32 @@ class AcceptCommand(object): if not force: return False - meta = self.api.get_prj_pseudometa(project) + status = self.api.project_status(project) packages = [] - for req in meta['requests']: - self.api.rm_from_prj(project, request_id=req['id'], msg='ready to accept') - packages.append(req['package']) - oldspecs = self.api.get_filelist_for_package(pkgname=req['package'], - project=self.api.project, - extension='spec') - print('Accepting staging review for {}'.format(req['package'])) - change_request_state(self.api.apiurl, - str(req['id']), - 'accepted', - message='Accept to %s' % self.api.project, - force=force) - self.create_new_links(self.api.project, req['package'], oldspecs) + rf = RequestFinder(self.api) + oldspecs = {} + for req in status.findall('staged_requests/entry'): + packages.append(req.get('package')) + + print('Checking file list of {}'.format(req.get('package'))) + os = self.api.get_filelist_for_package(pkgname=req.get('package'), + project=self.api.project, + extension='spec') + oldspecs[req.get('package')] = os + #self.create_new_links(self.api.project, req['package'], oldspecs) + + print(oldspecs) + + 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')) + time.sleep(1) - self.api.accept_status_comment(project, packages) self.api.staging_deactivate(project) + self.api.accept_status_comment(project, packages) return True diff --git a/osclib/request_finder.py b/osclib/request_finder.py index ecf95d7b..c115c1b8 100644 --- a/osclib/request_finder.py +++ b/osclib/request_finder.py @@ -36,14 +36,9 @@ class RequestFinder(object): self.api = api self.srs = {} - def find_request_id(self, request_id): - """ - Look up the request by ID to verify if it is correct - :param request_id: ID of the added request - """ - + def load_request(self, request_id): if not _is_int(request_id): - return False + return None url = makeurl(self.api.apiurl, ['request', str(request_id)]) try: @@ -56,6 +51,18 @@ class RequestFinder(object): if root.get('id', None) != str(request_id): return None + return root + + def find_request_id(self, request_id): + """ + Look up the request by ID to verify if it is correct + :param request_id: ID of the added request + """ + + root = self.load_request(request_id) + if not root: + return False + project = root.find('action').find('target').get('project') if (project != self.api.project and not project.startswith(self.api.cstaging)): msg = 'Request {} is not for {}, but for {}' diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index 2d8d38e6..deb966a9 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -888,10 +888,14 @@ class StagingAPI(object): url = self.makeurl(['staging', self.project, 'staging_projects']) return ET.parse(self.retried_GET(url)).getroot() - def project_status(self, staging): + def project_status(self, staging, 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)): @@ -900,15 +904,13 @@ class StagingAPI(object): def check_project_status(self, project): """ - Checks a staging project for acceptance. Use the JSON document - for staging project to base the decision. + Checks a staging project for acceptance. :param project: project to check :return true (ok)/false (empty prj) or list of strings with informations) """ - status = self.project_status(project) - return status and status.get('overall_state') == 'acceptable' + return self.project_status(project).get('state') == 'acceptable' def project_status_build_percent(self, status): final, tobuild = self.project_status_build_sum(status) @@ -942,7 +944,7 @@ class StagingAPI(object): def project_status_final(self, status): """Determine if staging project is both active and no longer pending.""" - return status['overall_state'] in ['acceptable', 'review', 'failed'] + return status.get('state') in ['acceptable', 'review', 'failed'] # we use a private function to mock it - httpretty is all or nothing def _fetch_project_meta(self, project):