def test_update_changes_modified(self, session): repo = Repo(self.p, **self.data) initial_timestamp = repo.modified.time() session.commit() repo.distro = "centos" session.commit() assert initial_timestamp < repo.modified.time()
def test_can_create_with_many_archs(self, session): repo = Repo(self.p, **self.data) arch1 = Arch(name="x86_64", repo=repo) arch2 = Arch(name="arm64", repo=repo) session.commit() repo = Repo.get(1) assert arch1 in repo.archs assert arch2 in repo.archs
def test_can_create(self, session): Repo(self.p, **self.data) session.commit() repo = Repo.get(1) assert repo.project.name == "ceph" assert repo.distro == "ubuntu" assert repo.distro_version == "trusty" assert repo.flavor == "default"
def test_update_a_repo_url(self, session): result = session.app.post_json('/api/repos/ceph/', params=self.repo_data) assert result.status_int == 200 assert not Repo.get(1).url new_data = self.repo_data.copy() new_data["url"] = "chacra.ceph.com/r/ceph/jewel/" result = session.app.post_json('/api/repos/ceph/', params=new_data) assert Repo.get(1).url == "chacra.ceph.com/r/ceph/jewel/"
def test_delete_a_repo(self, session): result = session.app.post_json('/api/repos/ceph/', params=self.repo_data) assert result.status_int == 200 assert Repo.get(1).status == "requested" new_data = self.repo_data.copy() new_data["status"] = "deleted" result = session.app.post_json('/api/repos/ceph/', params=new_data) assert not Repo.get(1)
def test_delete_will_delete_arch(self, session): repo = Repo(self.p, **self.data) Arch(name="x86_64", repo=repo) session.commit() repo = Repo.get(1) repo.delete() session.commit() assert not Repo.query.first() assert not Arch.query.first()
def test_update_repo_with_archs(self, session): data = self.repo_data.copy() data["archs"] = ["x86_64"] session.app.post_json('/api/repos/ceph/', params=data) repo = Repo.get(1) assert len(repo.archs) == 1 data["archs"] = ["x86_64", "arm64"] session.app.post_json('/api/repos/ceph/', params=data) repo = Repo.get(1) assert len(repo.archs) == 2
def index(self): documentation = "https://github.com/ceph/shaman#shaman" projects = Project.query.all() now = datetime.datetime.utcnow() # five days worth of data periods = [ (now - datetime.timedelta(days=day-1), now - datetime.timedelta(days=day+1)) for day in range(0, 10) ] area_data = [] for upper_range, lower_range in periods: day = lower_range + datetime.timedelta(days=1) day_data = {'period': day.strftime("%Y-%m-%d")} for project in projects: repository_count = Repo.filter_by( project=project).filter(Repo.status == "ready").filter( and_(Repo.modified > lower_range), and_(Repo.modified < upper_range) ).count() day_data[str(project.name)] = int(repository_count) area_data.append(day_data) latest_repos = Repo.query.filter_by(status="ready").order_by(desc(Repo.modified)).limit(10).all() latest_builds = Build.query.filter_by(status="completed").order_by(desc(Build.modified)).limit(10).all() return dict( description=description, documentation=documentation, area_data=str(area_data), projects=[str(p.name) for p in projects], latest_repos=latest_repos, latest_builds=latest_builds, )
def test_create_a_repo(self, session): result = session.app.post_json('/api/repos/ceph/', params=self.repo_data) assert result.status_int == 200 repo = Repo.get(1) assert repo.ref == "jewel" assert repo.project.name == "ceph" assert repo.flavor == "default" assert repo.extra["version"] == "10.2.2"
def __init__(self, _id): self.project = Project.get(request.context['project_id']) self.repo = Repo.get(_id) if not self.project: # TODO: nice project not found error template abort(404, 'project not found') if not self.repo: # TODO: nice project not found error template abort(404, 'build not found')
def index(self): repos = Repo.filter_by(project=self.project).order_by(desc(Repo.modified)).all() distinct = { "refs": list(set([b.ref for b in repos])) } return dict( project_name=self.project_name, distinct=distinct, builds=repos, section="Repos", )
def index(self): repos = Repo.filter_by( project=self.project, ref=request.context['ref'], sha1=request.context['sha1'], flavor=self.flavor_name ).order_by(desc(Repo.modified)).all() return dict( project_name=self.project.name, builds=repos, breadcrumb="> {} > {} > {}".format(request.context['ref'], request.context['sha1'], self.flavor_name), section="Repos", )
def index(self): repos = Repo.filter_by( project=self.project, ref=self.ref_name ).order_by(desc(Repo.modified)).all() distinct = { "sha1s": list(set([r.sha1 for r in repos])) } return dict( project_name=self.project.name, distinct=distinct, builds=repos, breadcrumb="> {}".format(self.ref_name), section="Repos", )
def index(self): repos = Repo.filter_by( project=self.project, ref=request.context['ref'], sha1=self.sha1_name ).order_by(desc(Repo.modified)).all() distinct = { "flavors": list(set([r.flavor for r in repos])) } return dict( project_name=self.project.name, distinct=distinct, builds=repos, breadcrumb="> {} > {}".format(request.context['ref'], self.sha1_name), section="Repos", )
def apply_filters(self, filters): # TODO: allow operators filters = deepcopy(filters) try: project = Project.filter_by(name=filters.pop('project')).first() query = Repo.filter_by(project=project) except KeyError: query = Repo.query if filters.get("distros", None): # TODO: we'll need some sort of schema validation here distro_list = util.parse_distro_query(filters.pop("distros")) distro_filter_list = [] has_arch_filter = False for distro in distro_list: # for deb-based distros we store codename in the db as version, # so try first with the codename, but fallback to # distro_version otherwise version_filter = distro["distro_codename"] or distro['distro_version'] if not version_filter: abort(400, "Invalid version or codename for distro: %s" % distro["distro"]) repo_filters = [Repo.distro == distro["distro"], Repo.distro_version == version_filter] if distro["arch"]: repo_filters.append(Arch.name == distro["arch"]) has_arch_filter = True distro_filter_list.append( and_(*repo_filters) ) if has_arch_filter: query = query.join(Repo.archs).filter(or_(*distro_filter_list)) else: query = query.filter(or_(*distro_filter_list)) for k, v in filters.items(): if k not in self.filters: # TODO: improve error reporting # 'invalid query params: %s' % k abort(400) if k in self.filters: query = self.filter_repo(k, v, query) return query
def index(self): documentation = "https://github.com/ceph/shaman#shaman" projects = Project.query.all() now = datetime.datetime.utcnow() # five days worth of data periods = [(now - datetime.timedelta(days=day - 1), now - datetime.timedelta(days=day + 1)) for day in range(0, 10)] area_data = [] for upper_range, lower_range in periods: day = lower_range + datetime.timedelta(days=1) day_data = {'period': day.strftime("%Y-%m-%d")} for project in projects: repository_count = Repo.filter_by(project=project).filter( Repo.status == "ready").filter( and_(Repo.modified > lower_range), and_(Repo.modified < upper_range)).count() # Do not add all the projects that haven't built anything for # the day if int(repository_count) == 0: continue day_data[str(project.name)] = int(repository_count) area_data.append(day_data) latest_repos = Repo.query.filter_by(status="ready").order_by( desc(Repo.modified)).limit(10).all() latest_builds = Build.query.filter_by(status="completed").order_by( desc(Build.modified)).limit(10).all() return dict( description=description, documentation=documentation, area_data=str(area_data), projects=[str(p.name) for p in projects], latest_repos=latest_repos, latest_builds=latest_builds, )
def setup(self): self.p = Project("ceph") self.data = base_repo_data() self.repo = Repo(self.p, **self.data) Arch(name="x86_64", repo=self.repo)
def test_can_create_with_extra(self, session): r = Repo(self.p, **self.data) r.extra = dict(version="10.2.2") session.commit() repo = Repo.get(1) assert repo.extra['version'] == "10.2.2"
def test_sets_modified(self, session): repo = Repo(self.p, **self.data) session.commit() assert repo.modified.timetuple()
def test_can_create_with_arch(self, session): repo = Repo(self.p, **self.data) arch = Arch(name="x86_64", repo=repo) session.commit() repo = Repo.get(1) assert arch in repo.archs