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