Package coprs :: Package logic :: Module complex_logic
[hide private]
[frames] | no frames]

Source Code for Module coprs.logic.complex_logic

  1  # coding: utf-8 
  2   
  3  import datetime 
  4  import time 
  5  import flask 
  6  import sqlalchemy 
  7   
  8  from .. import db 
  9  from .builds_logic import BuildsLogic 
 10  from copr_common.enums import StatusEnum 
 11  from coprs import models 
 12  from coprs import exceptions 
 13  from coprs.exceptions import ObjectNotFound, ActionInProgressException 
 14  from coprs.logic.packages_logic import PackagesLogic 
 15  from coprs.logic.actions_logic import ActionsLogic 
 16   
 17  from coprs.logic.users_logic import UsersLogic 
 18  from coprs.models import User, Copr 
 19  from .coprs_logic import CoprsLogic, CoprDirsLogic, CoprChrootsLogic 
20 21 22 -class ComplexLogic(object):
23 """ 24 Used for manipulation which affects multiply models 25 """ 26 27 @classmethod
28 - def delete_copr(cls, copr, admin_action=False):
29 """ 30 Delete copr and all its builds. 31 32 :param copr: 33 :param admin_action: set to True to bypass permission check 34 :raises ActionInProgressException: 35 :raises InsufficientRightsException: 36 """ 37 38 if admin_action: 39 user = copr.user 40 else: 41 user = flask.g.user 42 43 builds_query = BuildsLogic.get_multiple_by_copr(copr=copr) 44 45 if copr.persistent: 46 raise exceptions.InsufficientRightsException("This project is protected against deletion.") 47 48 for build in builds_query: 49 BuildsLogic.delete_build(user, build, send_delete_action=False) 50 51 CoprsLogic.delete_unsafe(user, copr)
52 53 54 @classmethod
55 - def delete_expired_projects(cls):
56 query = ( 57 models.Copr.query 58 .filter(models.Copr.delete_after.isnot(None)) 59 .filter(models.Copr.delete_after < datetime.datetime.now()) 60 .filter(models.Copr.deleted.isnot(True)) 61 ) 62 for copr in query.all(): 63 print("deleting project '{}'".format(copr.full_name)) 64 try: 65 cls.delete_copr(copr, admin_action=True) 66 except ActionInProgressException as e: 67 print(e) 68 print("project {} postponed".format(copr.full_name))
69 70 71 @classmethod
72 - def fork_copr(cls, copr, user, dstname, dstgroup=None):
73 forking = ProjectForking(user, dstgroup) 74 created = (not bool(forking.get(copr, dstname))) 75 fcopr = forking.fork_copr(copr, dstname) 76 77 if fcopr.full_name == copr.full_name: 78 raise exceptions.DuplicateException("Source project should not be same as destination") 79 80 builds_map = {} 81 for package in copr.main_dir.packages: 82 fpackage = forking.fork_package(package, fcopr) 83 build = package.last_build(successful=True) 84 if not build: 85 continue 86 87 fbuild = forking.fork_build(build, fcopr, fpackage) 88 89 if build.result_dir: 90 builds_map['srpm-builds'] = (build.result_dir, fbuild.result_dir) 91 92 for chroot, fchroot in zip(build.build_chroots, fbuild.build_chroots): 93 if chroot.result_dir: 94 builds_map[chroot.name] = (chroot.result_dir, fchroot.result_dir) 95 96 db.session.commit() 97 ActionsLogic.send_fork_copr(copr, fcopr, builds_map) 98 return fcopr, created
99 100 @staticmethod
101 - def get_group_copr_safe(group_name, copr_name, **kwargs):
102 group = ComplexLogic.get_group_by_name_safe(group_name) 103 try: 104 return CoprsLogic.get_by_group_id( 105 group.id, copr_name, **kwargs).one() 106 except sqlalchemy.orm.exc.NoResultFound: 107 raise ObjectNotFound( 108 message="Project @{}/{} does not exist." 109 .format(group_name, copr_name))
110 111 @staticmethod
112 - def get_copr_safe(user_name, copr_name, **kwargs):
113 """ Get one project. 114 115 This always return personal project. For group projects see get_group_copr_safe(). 116 """ 117 try: 118 return CoprsLogic.get(user_name, copr_name, **kwargs).filter(Copr.group_id.is_(None)).one() 119 except sqlalchemy.orm.exc.NoResultFound: 120 raise ObjectNotFound( 121 message="Project {}/{} does not exist." 122 .format(user_name, copr_name))
123 124 @staticmethod
125 - def get_copr_by_owner_safe(owner_name, copr_name, **kwargs):
126 if owner_name[0] == "@": 127 return ComplexLogic.get_group_copr_safe(owner_name[1:], copr_name, **kwargs) 128 return ComplexLogic.get_copr_safe(owner_name, copr_name, **kwargs)
129 130 @staticmethod
131 - def get_copr_dir_safe(ownername, copr_dirname, **kwargs):
132 try: 133 return CoprDirsLogic.get_by_ownername(ownername, copr_dirname).one() 134 except sqlalchemy.orm.exc.NoResultFound: 135 raise ObjectNotFound(message="copr dir {}/{} does not exist." 136 .format(ownername, copr_dirname))
137 138 @staticmethod
139 - def get_copr_by_id_safe(copr_id):
140 try: 141 return CoprsLogic.get_by_id(copr_id).one() 142 except sqlalchemy.orm.exc.NoResultFound: 143 raise ObjectNotFound( 144 message="Project with id {} does not exist." 145 .format(copr_id))
146 147 @staticmethod
148 - def get_build_safe(build_id):
149 try: 150 return BuildsLogic.get_by_id(build_id).one() 151 except sqlalchemy.orm.exc.NoResultFound: 152 raise ObjectNotFound( 153 message="Build {} does not exist.".format(build_id))
154 155 @staticmethod
156 - def get_package_by_id_safe(package_id):
157 try: 158 return PackagesLogic.get_by_id(package_id).one() 159 except sqlalchemy.orm.exc.NoResultFound: 160 raise ObjectNotFound( 161 message="Package {} does not exist.".format(package_id))
162 163 @staticmethod
164 - def get_package_safe(copr_dir, package_name):
165 try: 166 return PackagesLogic.get(copr_dir.id, package_name).one() 167 except sqlalchemy.orm.exc.NoResultFound: 168 raise ObjectNotFound( 169 message="Package {} in the copr_dir {} does not exist." 170 .format(package_name, copr_dir))
171 172 @staticmethod
173 - def get_group_by_name_safe(group_name):
174 try: 175 group = UsersLogic.get_group_by_alias(group_name).one() 176 except sqlalchemy.orm.exc.NoResultFound: 177 raise ObjectNotFound( 178 message="Group {} does not exist.".format(group_name)) 179 return group
180 181 @staticmethod
182 - def get_copr_chroot_safe(copr, chroot_name):
183 try: 184 chroot = CoprChrootsLogic.get_by_name_safe(copr, chroot_name) 185 except (ValueError, KeyError, RuntimeError) as e: 186 raise ObjectNotFound(message=str(e)) 187 188 if not chroot: 189 raise ObjectNotFound( 190 message="Chroot name {} does not exist.".format(chroot_name)) 191 192 return chroot
193 194 @staticmethod
195 - def get_active_groups_by_user(user_name):
196 names = flask.g.user.user_groups 197 if names: 198 query = UsersLogic.get_groups_by_names_list(names) 199 return query.filter(User.name == user_name) 200 else: 201 return []
202 203 @staticmethod
204 - def get_queue_sizes():
205 importing = BuildsLogic.get_build_importing_queue(background=False).count() 206 pending = BuildsLogic.get_pending_build_tasks(background=False).count() 207 running = BuildsLogic.get_build_tasks(StatusEnum("running")).count() 208 209 return dict( 210 importing=importing, 211 pending=pending, 212 running=running, 213 )
214 215 @classmethod
216 - def get_coprs_permissible_by_user(cls, user):
225
226 227 -class ProjectForking(object):
228 - def __init__(self, user, group=None):
229 self.user = user 230 self.group = group 231 232 if group and not user.can_build_in_group(group): 233 raise exceptions.InsufficientRightsException( 234 "Only members may create projects in the particular groups.")
235
236 - def get(self, copr, name):
237 return CoprsLogic.get_by_group_id(self.group.id, name).first() if self.group \ 238 else CoprsLogic.filter_without_group_projects(CoprsLogic.get(flask.g.user.name, name)).first()
239
240 - def fork_copr(self, copr, name):
241 fcopr = self.get(copr, name) 242 if not fcopr: 243 fcopr = self.create_object(models.Copr, copr, 244 exclude=["id", "group_id", "created_on", 245 "scm_repo_url", "scm_api_type", "scm_api_auth_json", 246 "persistent", "auto_prune", "contact", "webhook_secret"]) 247 248 fcopr.forked_from_id = copr.id 249 fcopr.user = self.user 250 fcopr.user_id = self.user.id 251 fcopr.created_on = int(time.time()) 252 if name: 253 fcopr.name = name 254 if self.group: 255 fcopr.group = self.group 256 fcopr.group_id = self.group.id 257 258 fcopr_dir = models.CoprDir(name=fcopr.name, copr=fcopr, main=True) 259 260 for chroot in list(copr.copr_chroots): 261 CoprChrootsLogic.create_chroot(self.user, fcopr, chroot.mock_chroot, chroot.buildroot_pkgs, 262 chroot.repos, comps=chroot.comps, comps_name=chroot.comps_name, 263 with_opts=chroot.with_opts, without_opts=chroot.without_opts) 264 db.session.add(fcopr) 265 db.session.add(fcopr_dir) 266 267 return fcopr
268
269 - def fork_package(self, package, fcopr):
270 fpackage = PackagesLogic.get(fcopr.main_dir.id, package.name).first() 271 if not fpackage: 272 fpackage = self.create_object(models.Package, package, exclude=["id", "copr_id", "copr_dir_id", "webhook_rebuild"]) 273 fpackage.copr = fcopr 274 fpackage.copr_dir = fcopr.main_dir 275 db.session.add(fpackage) 276 return fpackage
277
278 - def fork_build(self, build, fcopr, fpackage):
279 fbuild = self.create_object(models.Build, build, exclude=["id", "copr_id", "copr_dir_id", "package_id", "result_dir"]) 280 fbuild.copr = fcopr 281 fbuild.package = fpackage 282 fbuild.copr_dir = fcopr.main_dir 283 db.session.add(fbuild) 284 db.session.flush() 285 286 fbuild.result_dir = '{:08}'.format(fbuild.id) 287 fbuild.build_chroots = [self.create_object(models.BuildChroot, c, exclude=["id", "build_id", "result_dir"]) for c in build.build_chroots] 288 for chroot in fbuild.build_chroots: 289 chroot.result_dir = '{:08}-{}'.format(fbuild.id, fpackage.name) 290 chroot.status = StatusEnum("forked") 291 db.session.add(fbuild) 292 return fbuild
293
294 - def create_object(self, clazz, from_object, exclude=list()):
295 arguments = {} 296 for name, column in from_object.__mapper__.columns.items(): 297 if not name in exclude: 298 arguments[name] = getattr(from_object, name) 299 return clazz(**arguments)
300