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

Source Code for Module coprs.logic.modules_logic

  1  import os 
  2  import time 
  3  import base64 
  4  import json 
  5  import requests 
  6  import modulemd 
  7  from sqlalchemy import and_ 
  8  from coprs import models 
  9  from coprs import db 
 10  from coprs import exceptions 
 11  from coprs.logic import builds_logic 
 12  from wtforms import ValidationError 
13 14 15 -class ModulesLogic(object):
16 @classmethod
17 - def get(cls, module_id):
18 """ 19 Return single module identified by `module_id` 20 """ 21 return models.Module.query.filter(models.Module.id == module_id)
22 23 @classmethod
24 - def get_by_nsv(cls, copr, name, stream, version):
30 31 @classmethod
32 - def get_multiple(cls):
33 return models.Module.query.order_by(models.Module.id.desc())
34 35 @classmethod
36 - def get_multiple_by_copr(cls, copr):
38 39 @classmethod
40 - def yaml2modulemd(cls, yaml):
41 mmd = modulemd.ModuleMetadata() 42 mmd.loads(yaml) 43 return mmd
44 45 @classmethod
46 - def from_modulemd(cls, yaml):
47 mmd = cls.yaml2modulemd(yaml) 48 return models.Module(name=mmd.name, stream=mmd.stream, version=mmd.version, summary=mmd.summary, 49 description=mmd.description, yaml_b64=base64.b64encode(yaml))
50 51 @classmethod
52 - def validate(cls, yaml):
53 mmd = cls.yaml2modulemd(yaml) 54 if not all([mmd.name, mmd.stream, mmd.version]): 55 raise ValidationError("Module should contain name, stream and version")
56 57 @classmethod
58 - def add(cls, user, copr, module):
59 if not user.can_build_in(copr): 60 raise exceptions.InsufficientRightsException("You don't have permissions to build in this copr.") 61 62 module.copr_id = copr.id 63 module.copr = copr 64 module.created_on = time.time() 65 66 db.session.add(module) 67 return module
68
69 70 -class ModulemdGenerator(object):
71 - def __init__(self, name="", stream="", version=0, summary="", config=None):
72 self.config = config 73 self.mmd = modulemd.ModuleMetadata() 74 self.mmd.name = name 75 self.mmd.stream = stream 76 self.mmd.version = version 77 self.mmd.summary = summary
78 79 @property
80 - def nsv(self):
81 return "{}-{}-{}".format(self.mmd.name, self.mmd.stream, self.mmd.version)
82
83 - def add_api(self, packages):
84 for package in packages: 85 self.mmd.api.add_rpm(str(package))
86
87 - def add_filter(self, packages):
88 for package in packages: 89 self.mmd.filter.add_rpm(str(package))
90
91 - def add_profiles(self, profiles):
92 for i, values in profiles: 93 name, packages = values 94 self.mmd.profiles[name] = modulemd.profile.ModuleProfile() 95 for package in packages: 96 self.mmd.profiles[name].add_rpm(str(package))
97
98 - def add_components(self, packages, filter_packages, builds):
99 build_ids = sorted(list(set([int(id) for p, id in zip(packages, builds) 100 if p in filter_packages]))) 101 for package in filter_packages: 102 build_id = builds[packages.index(package)] 103 build = builds_logic.BuildsLogic.get_by_id(build_id).first() 104 build_chroot = self._build_chroot(build) 105 buildorder = build_ids.index(int(build.id)) 106 rationale = "User selected the package as a part of the module" 107 self.add_component(package, build, build_chroot, rationale, buildorder)
108
109 - def _build_chroot(self, build):
110 chroot = None 111 for chroot in build.build_chroots: 112 if chroot.name == "custom-1-x86_64": 113 break 114 return chroot
115
116 - def add_component(self, package_name, build, chroot, rationale, buildorder=1):
117 ref = str(chroot.git_hash) if chroot else "" 118 distgit_url = self.config["DIST_GIT_URL"].replace("/cgit", "/git") 119 url = os.path.join(distgit_url, build.copr.full_name, "{}.git".format(build.package.name)) 120 self.mmd.components.add_rpm(str(package_name), rationale, 121 repository=url, ref=ref, 122 buildorder=buildorder)
123
124 - def add_requires(self, module, stream):
125 self.mmd.add_requires(module, stream)
126
127 - def add_buildrequires(self, module, stream):
128 self.mmd.add_buildrequires(module, stream)
129
130 - def add_base_runtime(self):
131 name, stream = "base-runtime", "master" 132 self.add_requires(name, stream) 133 self.add_buildrequires(name, stream)
134
135 - def generate(self):
136 return self.mmd.dumps()
137
138 - def dump(self, handle):
139 return self.mmd.dump(handle)
140
141 142 -class MBSProxy(object):
143 - def __init__(self, mbs_url, user_name=None):
144 self.url = mbs_url 145 self.user = user_name
146
147 - def post(self, json=None, data=None, files=None):
148 request = requests.post(self.url, verify=False, 149 json=json, data=data, files=files) 150 return MBSResponse(request)
151
152 - def build_module(self, owner, project, nsv, modulemd):
153 return self.post( 154 data={"owner": self.user, "copr_owner": owner, "copr_project": project}, 155 files={"yaml": ("{}.yaml".format(nsv), modulemd)}, 156 )
157
158 159 -class MBSResponse(object):
160 - def __init__(self, response):
161 self.response = response
162 163 @property
164 - def failed(self):
165 return self.response.status_code != 201
166 167 @property
168 - def message(self):
169 if self.response.status_code in [500, 403, 404]: 170 return "Error from MBS: {} - {}".format(self.response.status_code, self.response.reason) 171 resp = json.loads(self.response.content) 172 if self.response.status_code != 201: 173 return "Error from MBS: {}".format(resp["message"]) 174 return "Created module {}-{}-{}".format(resp["name"], resp["stream"], resp["version"])
175