Trees | Indices | Help |
---|
|
1 import time 2 3 from coprs import db 4 from coprs import exceptions 5 from coprs import models 6 from coprs import helpers 7 from coprs import signals 8 9 from coprs.logic import coprs_logic 10 from coprs.logic import users_logic13 @classmethod 17 18 @classmethod15420 copr = kwargs.get('copr', None) 21 username = kwargs.get('username', None) 22 coprname = kwargs.get('coprname', None) 23 24 query = models.Build.query.order_by(models.Build.submitted_on.desc()) 25 26 # if we get copr, query by its id 27 if copr: 28 query = query.filter(models.Build.copr == copr) 29 elif username and coprname: 30 query = query.join(models.Build.copr).\ 31 options(db.contains_eager(models.Build.copr)).\ 32 join(models.Copr.owner).\ 33 filter(models.Copr.name == coprname).\ 34 filter(models.User.openid_name == models.User.openidize_name(username)).\ 35 order_by(models.Build.submitted_on.desc()) 36 else: 37 raise exceptions.ArgumentMissingException('Must pass either copr or both coprname and username') 38 39 return query40 41 @classmethod43 # return builds that aren't both started and finished (if build start submission 44 # fails, we still want to mark the build as non-waiting, if it ended) 45 # this has very different goal then get_multiple, so implement it alone 46 query = models.Build.query.join(models.Build.copr).\ 47 join(models.User).\ 48 options(db.contains_eager(models.Build.copr)).\ 49 options(db.contains_eager('copr.owner')).\ 50 filter((models.Build.started_on == None) | (models.Build.started_on < int(time.time()-7200))).\ 51 filter(models.Build.ended_on == None).\ 52 filter(models.Build.canceled != True).\ 53 order_by(models.Build.submitted_on.asc()) 54 return query55 56 @classmethod 59 60 @classmethod63 64 coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action( 65 user, copr, 66 'Can\'t build while there is an operation in progress: {action}') 67 users_logic.UsersLogic.raise_if_cant_build_in_copr( 68 user, copr, 69 'You don\'t have permissions to build in this copr.') 70 71 if not repos: 72 repos = copr.repos 73 74 build = models.Build( 75 user=user, 76 pkgs=pkgs, 77 copr=copr, 78 repos=repos, 79 submitted_on=int(time.time())) 80 81 if memory_reqs: 82 build.memory_reqs = memory_reqs 83 84 if timeout: 85 build.timeout = timeout 86 87 db.session.add(build) 88 89 # add BuildChroot object for each active chroot 90 # this copr is assigned to 91 for chroot in copr.active_chroots: 92 buildchroot = models.BuildChroot( 93 build=build, 94 mock_chroot=chroot) 95 96 db.session.add(buildchroot) 97 98 return build99 100 @classmethod102 if 'chroot' in upd_dict: 103 # update respective chroot status 104 for build_chroot in build.build_chroots: 105 if build_chroot.name == upd_dict['chroot']: 106 if 'status' in upd_dict: 107 build_chroot.status = upd_dict['status'] 108 109 db.session.add(build_chroot) 110 111 for attr in ['results', 'started_on', 'ended_on']: 112 value = upd_dict.get(attr, None) 113 if value: 114 # only update started_on once 115 if attr == 'started_on' and build.started_on: 116 continue 117 118 # only update ended_on and results 119 # when there are no pending builds 120 if (attr in ['ended_on', 'results'] and 121 build.has_pending_chroot): 122 continue 123 124 if attr == 'ended_on': 125 signals.build_finished.send(cls, build=build) 126 127 setattr(build, attr, value) 128 129 db.session.add(build)130 131 @classmethod133 if build.user_id != user.id: 134 raise exceptions.InsufficientRightsException('You can only cancel your own builds.') 135 build.canceled = True136 137 @classmethod139 if build.user_id != user.id: 140 raise exceptions.InsufficientRightsException('You can only delete your own builds.') 141 142 action = models.Action(action_type=helpers.ActionTypeEnum('delete'), 143 object_type='build', 144 object_id=build.id, 145 old_value='{0}/{1}'.format(build.copr.owner.name, 146 build.copr.name), 147 data=build.pkgs, 148 created_on=int(time.time())) 149 150 db.session.add(action) 151 for build_chroot in build.build_chroots: 152 db.session.delete(build_chroot) 153 db.session.delete(build)
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Tue Jan 28 00:38:17 2014 | http://epydoc.sourceforge.net |