add adi command to create an ad interim staging prj for all non-ring packages
This commit is contained in:
parent
50aeb49eb8
commit
5de87f84e4
@ -35,6 +35,7 @@ from osclib.obslock import OBSLock
|
|||||||
from osclib.select_command import SelectCommand
|
from osclib.select_command import SelectCommand
|
||||||
from osclib.stagingapi import StagingAPI
|
from osclib.stagingapi import StagingAPI
|
||||||
from osclib.unselect_command import UnselectCommand
|
from osclib.unselect_command import UnselectCommand
|
||||||
|
from osclib.adi_command import AdiCommand
|
||||||
|
|
||||||
OSC_STAGING_VERSION = '0.0.1'
|
OSC_STAGING_VERSION = '0.0.1'
|
||||||
|
|
||||||
@ -121,7 +122,7 @@ def do_staging(self, subcmd, opts, *args):
|
|||||||
min_args = 2
|
min_args = 2
|
||||||
elif cmd == 'unselect':
|
elif cmd == 'unselect':
|
||||||
min_args, max_args = 1, None
|
min_args, max_args = 1, None
|
||||||
elif cmd in ('list', 'cleanup_rings'):
|
elif cmd in ('adi', 'list', 'cleanup_rings'):
|
||||||
min_args, max_args = 0, 0
|
min_args, max_args = 0, 0
|
||||||
else:
|
else:
|
||||||
raise oscerr.WrongArgs('Unknown command: %s' % cmd)
|
raise oscerr.WrongArgs('Unknown command: %s' % cmd)
|
||||||
@ -162,9 +163,11 @@ def do_staging(self, subcmd, opts, *args):
|
|||||||
if opts.add:
|
if opts.add:
|
||||||
api.mark_additional_packages(tprj, [opts.add])
|
api.mark_additional_packages(tprj, [opts.add])
|
||||||
else:
|
else:
|
||||||
SelectCommand(api).perform(tprj, args[2:], opts.move,
|
SelectCommand(api, tprj).perform(args[2:], opts.move,
|
||||||
opts.from_, opts.no_freeze)
|
opts.from_, opts.no_freeze)
|
||||||
elif cmd == 'cleanup_rings':
|
elif cmd == 'cleanup_rings':
|
||||||
CleanupRings(api).perform()
|
CleanupRings(api).perform()
|
||||||
elif cmd == 'list':
|
elif cmd == 'list':
|
||||||
ListCommand(api).perform()
|
ListCommand(api).perform()
|
||||||
|
elif cmd == 'adi':
|
||||||
|
AdiCommand(api).perform()
|
||||||
|
49
osclib/adi_command.py
Normal file
49
osclib/adi_command.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
from osc import oscerr
|
||||||
|
|
||||||
|
from osclib.select_command import SelectCommand
|
||||||
|
|
||||||
|
class AdiCommand:
|
||||||
|
def __init__(self, api):
|
||||||
|
self.api = api
|
||||||
|
|
||||||
|
def perform(self):
|
||||||
|
"""
|
||||||
|
Perform the list command
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Print out the left overs
|
||||||
|
requests = self.api.get_open_requests()
|
||||||
|
|
||||||
|
non_ring_packages = []
|
||||||
|
non_ring_requests = []
|
||||||
|
|
||||||
|
for request in requests:
|
||||||
|
# Consolidate all data from request
|
||||||
|
request_id = int(request.get('id'))
|
||||||
|
action = request.findall('action')
|
||||||
|
if not action:
|
||||||
|
msg = 'Request {} has no action'.format(request_id)
|
||||||
|
raise oscerr.WrongArgs(msg)
|
||||||
|
# we care only about first action
|
||||||
|
action = action[0]
|
||||||
|
|
||||||
|
# Where are we targeting the package
|
||||||
|
target_package = action.find('target').get('package')
|
||||||
|
|
||||||
|
if not self.api.ring_packages.get(target_package):
|
||||||
|
non_ring_packages.append(target_package)
|
||||||
|
non_ring_requests.append(request_id)
|
||||||
|
|
||||||
|
if len(non_ring_packages):
|
||||||
|
print "Not in a ring:", ' '.join(sorted(non_ring_packages))
|
||||||
|
|
||||||
|
name = self.api.create_adi_project(None)
|
||||||
|
|
||||||
|
sc = SelectCommand(self.api, name)
|
||||||
|
|
||||||
|
for request in non_ring_requests:
|
||||||
|
if not self.api.rq_to_prj(request, name):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Notify everybody about the changes
|
||||||
|
self.api.update_status_comments(name, 'select')
|
@ -14,9 +14,10 @@ MOVE = 'move'
|
|||||||
|
|
||||||
class SelectCommand(object):
|
class SelectCommand(object):
|
||||||
|
|
||||||
def __init__(self, api):
|
def __init__(self, api, target_project):
|
||||||
self.api = api
|
self.api = api
|
||||||
self.affected_projects = set()
|
self.affected_projects = set()
|
||||||
|
self.target_project = target_project
|
||||||
|
|
||||||
def _package(self, request):
|
def _package(self, request):
|
||||||
"""
|
"""
|
||||||
@ -118,7 +119,6 @@ class SelectCommand(object):
|
|||||||
print('Freeze the prj first')
|
print('Freeze the prj first')
|
||||||
return False
|
return False
|
||||||
# FreezeCommand(self.api).perform(target_project)
|
# FreezeCommand(self.api).perform(target_project)
|
||||||
self.target_project = target_project
|
|
||||||
|
|
||||||
for request in RequestFinder.find_sr(requests, self.api):
|
for request in RequestFinder.find_sr(requests, self.api):
|
||||||
if not self.select_request(request, move, from_):
|
if not self.select_request(request, move, from_):
|
||||||
|
@ -245,13 +245,16 @@ class StagingAPI(object):
|
|||||||
projects.append(val.get('name'))
|
projects.append(val.get('name'))
|
||||||
return projects
|
return projects
|
||||||
|
|
||||||
|
def is_adi_project(self, p):
|
||||||
|
return ':adi:' in p
|
||||||
|
|
||||||
def get_adi_projects(self):
|
def get_adi_projects(self):
|
||||||
"""
|
"""
|
||||||
Get all current running ADI projects
|
Get all current running ADI projects
|
||||||
:return list of known ADI projects
|
:return list of known ADI projects
|
||||||
"""
|
"""
|
||||||
|
|
||||||
projects = [p for p in self.get_staging_project() if ':adi:' in p]
|
projects = [p for p in self.get_staging_projects() if self.is_adi_project(p) ]
|
||||||
return projects
|
return projects
|
||||||
|
|
||||||
def do_change_review_state(self, request_id, newstate, message=None,
|
def do_change_review_state(self, request_id, newstate, message=None,
|
||||||
@ -744,7 +747,7 @@ class StagingAPI(object):
|
|||||||
# The force_enable_build will avoid the
|
# The force_enable_build will avoid the
|
||||||
# map_ring_package_to_subproject
|
# map_ring_package_to_subproject
|
||||||
if not force_enable_build:
|
if not force_enable_build:
|
||||||
if self.crings and not self.ring_packages.get(tar_pkg):
|
if self.crings and not self.ring_packages.get(tar_pkg) and not self.is_adi_project(project):
|
||||||
disable_build = True
|
disable_build = True
|
||||||
else:
|
else:
|
||||||
project = self.map_ring_package_to_subject(project, tar_pkg)
|
project = self.map_ring_package_to_subject(project, tar_pkg)
|
||||||
@ -1092,9 +1095,13 @@ class StagingAPI(object):
|
|||||||
def _candidate_adi_project(self):
|
def _candidate_adi_project(self):
|
||||||
"""Decide a candidate name for an ADI project."""
|
"""Decide a candidate name for an ADI project."""
|
||||||
adi_projects = sorted(self.get_adi_projects())
|
adi_projects = sorted(self.get_adi_projects())
|
||||||
|
adi_index = 1
|
||||||
for i, project in enumerate(adi_projects):
|
for i, project in enumerate(adi_projects):
|
||||||
if not project.endswith(i):
|
adi_index = i + 1
|
||||||
return self.adi_prj_from_number(i)
|
if not project.endswith(str(adi_index)):
|
||||||
|
return self.adi_prj_from_number(adi_index)
|
||||||
|
adi_index = i + 2
|
||||||
|
return self.adi_prj_from_number(adi_index)
|
||||||
|
|
||||||
def create_adi_project(self, name):
|
def create_adi_project(self, name):
|
||||||
"""Create an ADI project."""
|
"""Create an ADI project."""
|
||||||
@ -1122,5 +1129,9 @@ class StagingAPI(object):
|
|||||||
<arch>x86_64</arch>
|
<arch>x86_64</arch>
|
||||||
</repository>
|
</repository>
|
||||||
</project>""".format(name, self.project)
|
</project>""".format(name, self.project)
|
||||||
url = ""
|
url = make_meta_url('prj', name, self.apiurl)
|
||||||
http_PUT(url, data=meta)
|
http_PUT(url, data=meta)
|
||||||
|
# put twice because on first put, the API adds useless maintainer
|
||||||
|
http_PUT(url, data=meta)
|
||||||
|
|
||||||
|
return name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user