Package coprs :: Package rest_api :: Package resources :: Module project_chroot
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.resources.project_chroot

  1  # coding: utf-8 
  2   
  3  import logging 
  4   
  5  log = logging.getLogger(__name__) 
  6   
  7  import flask 
  8  from flask import url_for, make_response 
  9  from flask_restful import Resource 
 10   
 11  from sqlalchemy.exc import IntegrityError 
 12   
 13  from ... import db 
 14  from ...logic.coprs_logic import MockChrootsLogic, CoprChrootsLogic 
 15  from ...exceptions import InsufficientRightsException, MalformedArgumentException 
 16   
 17  from ..exceptions import AccessForbidden, MalformedRequest, \ 
 18      ObjectAlreadyExists, ObjectNotFoundError 
 19  from ..common import rest_api_auth_required, render_copr_chroot, get_project_safe 
 20  from ..schemas import CoprChrootSchema, CoprChrootCreateSchema 
 21  from ..util import get_one_safe, mm_deserialize 
22 23 24 -class ProjectChrootListR(Resource):
25 26 @classmethod
27 - def get(cls, project_id):
28 project = get_project_safe(project_id) 29 30 return { 31 "chroots": [ 32 render_copr_chroot(chroot) 33 for chroot in project.active_copr_chroots 34 ], 35 "_links": { 36 "self": {"href": url_for(".projectchrootlistr", project_id=project_id)} 37 } 38 }
39 40 @classmethod 41 @rest_api_auth_required
42 - def post(cls, project_id):
43 project = get_project_safe(project_id) 44 45 req = mm_deserialize(CoprChrootCreateSchema(), 46 flask.request.data.decode("utf-8")) 47 name = req.pop("name") 48 49 try: 50 mock_chroot = get_one_safe(MockChrootsLogic.get_from_name(name)) 51 except (MalformedArgumentException, ObjectNotFoundError) as err: 52 raise MalformedRequest("Bad mock chroot name: {}. Error: {}".format(name, err)) 53 54 CoprChrootsLogic.create_chroot(flask.g.user, project, mock_chroot, **req) 55 try: 56 db.session.commit() 57 except IntegrityError as err: 58 # assuming conflict with existing chroot 59 db.session.rollback() 60 if get_one_safe(CoprChrootsLogic.get_by_name(project, name)) is not None: 61 raise ObjectAlreadyExists("Copr {} already has chroot {} enabled" 62 .format(project.full_name, name)) 63 64 resp = make_response("", 201) 65 resp.headers["Location"] = url_for(".projectchrootr", 66 project_id=project.id, name=name) 67 return resp
68
69 70 -class ProjectChrootR(Resource):
71 72 @staticmethod
73 - def _get_chroot_safe(copr, name):
74 try: 75 chroot = get_one_safe(CoprChrootsLogic.get_by_name(copr, name)) 76 except MalformedArgumentException as err: 77 raise MalformedRequest("Bad mock chroot name: {}".format(err)) 78 return chroot
79
80 - def get(self, project_id, name):
85 86 @classmethod 87 @rest_api_auth_required
88 - def delete(cls, project_id, name):
89 project = get_project_safe(project_id) 90 chroot = CoprChrootsLogic.get_by_name_safe(project, name) 91 92 if chroot: 93 try: 94 CoprChrootsLogic.remove_copr_chroot(flask.g.user, chroot) 95 except InsufficientRightsException as err: 96 raise AccessForbidden("Failed to remove copr chroot: {}".format(err)) 97 98 db.session.commit() 99 100 return "", 204
101 102 @rest_api_auth_required
103 - def put(self, project_id, name):
104 project = get_project_safe(project_id) 105 chroot = self._get_chroot_safe(project, name) 106 107 chroot_data = mm_deserialize(CoprChrootSchema(), flask.request.data.decode("utf-8")) 108 try: 109 updated_chroot = CoprChrootsLogic.update_chroot( 110 user=flask.g.user, 111 copr_chroot=chroot, 112 **chroot_data 113 ) 114 except InsufficientRightsException as err: 115 raise AccessForbidden("Failed to update copr chroot: {}".format(err)) 116 117 db.session.commit() 118 return render_copr_chroot(updated_chroot)
119