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 chroot_data = mm_deserialize(CoprChrootCreateSchema(), 46 flask.request.data.decode("utf-8")) 47 48 req = chroot_data.data 49 name = req.pop("name") 50 51 try: 52 mock_chroot = get_one_safe(MockChrootsLogic.get_from_name(name)) 53 except (MalformedArgumentException, ObjectNotFoundError) as err: 54 raise MalformedRequest("Bad mock chroot name: {}. Error: {}".format(name, err)) 55 56 CoprChrootsLogic.create_chroot(flask.g.user, project, mock_chroot, **req) 57 try: 58 db.session.commit() 59 except IntegrityError as err: 60 # assuming conflict with existing chroot 61 db.session.rollback() 62 if get_one_safe(CoprChrootsLogic.get_by_name(project, name)) is not None: 63 raise ObjectAlreadyExists("Copr {} already has chroot {} enabled" 64 .format(project.full_name, name)) 65 66 resp = make_response("", 201) 67 resp.headers["Location"] = url_for(".projectchrootr", 68 project_id=project.id, name=name) 69 return resp
70
71 72 -class ProjectChrootR(Resource):
73 74 @staticmethod
75 - def _get_chroot_safe(copr, name):
76 try: 77 chroot = get_one_safe(CoprChrootsLogic.get_by_name(copr, name)) 78 except MalformedArgumentException as err: 79 raise MalformedRequest("Bad mock chroot name: {}".format(err)) 80 return chroot
81
82 - def get(self, project_id, name):
83 project = get_project_safe(project_id) 84 chroot = self._get_chroot_safe(project, name) 85 86 return render_copr_chroot(chroot)
87 88 @classmethod 89 @rest_api_auth_required
90 - def delete(cls, project_id, name):
91 project = get_project_safe(project_id) 92 chroot = CoprChrootsLogic.get_by_name_safe(project, name) 93 94 if chroot: 95 try: 96 CoprChrootsLogic.remove_copr_chroot(flask.g.user, chroot) 97 except InsufficientRightsException as err: 98 raise AccessForbidden("Failed to remove copr chroot: {}".format(err)) 99 100 db.session.commit() 101 102 return "", 204
103 104 @rest_api_auth_required
105 - def put(self, project_id, name):
106 project = get_project_safe(project_id) 107 chroot = self._get_chroot_safe(project, name) 108 109 chroot_data = mm_deserialize(CoprChrootSchema(), flask.request.data.decode("utf-8")) 110 try: 111 updated_chroot = CoprChrootsLogic.update_chroot( 112 user=flask.g.user, 113 copr_chroot=chroot, 114 **chroot_data.data 115 ) 116 except InsufficientRightsException as err: 117 raise AccessForbidden("Failed to update copr chroot: {}".format(err)) 118 119 db.session.commit() 120 return render_copr_chroot(updated_chroot)
121