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

Source Code for Module coprs.logic.builds_logic

  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_logic 
11 12 -class BuildsLogic(object):
13 @classmethod
14 - def get(cls, build_id):
15 query = models.Build.query.filter(models.Build.id == build_id) 16 return query
17 18 @classmethod
19 - def get_multiple(cls, user, **kwargs):
20 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 query
40 41 @classmethod
42 - def get_waiting(cls):
43 # 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 query
55 56 @classmethod
57 - def get_by_ids(cls, ids):
58 return models.Build.query.filter(models.Build.id.in_(ids))
59 60 @classmethod
61 - def add(cls, user, pkgs, copr, 62 repos=None, memory_reqs=None, timeout=None):
63 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 build
99 100 @classmethod
101 - def update_state_from_dict(cls, build, upd_dict):
102 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 @classmethod
132 - def cancel_build(cls, user, build):
133 if build.user_id != user.id: 134 raise exceptions.InsufficientRightsException('You can only cancel your own builds.') 135 build.canceled = True
136 137 @classmethod
138 - def delete_build(cls, user, build):
139 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)
154