Work on accept command - not yet done

This commit is contained in:
Stephan Kulow 2019-10-09 11:10:08 +02:00
parent 9235ab50db
commit 63ccac76d5
3 changed files with 49 additions and 34 deletions

View File

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

View File

@ -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 {}'

View File

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