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