def post(self): """Add a new buildout to database.""" try: data = self.request.json_body['data'] checksum = zlib.adler32(self.request.body) checksum_buildout = Buildout.get_by_checksum(checksum) if checksum_buildout: logging.info("Checksum matched") logging.info("Updating datetime..") checksum_buildout.datetime = datetime.now() DBSession.flush() raise Exception("No changes with existing data.") logging.info("New checksum") jsondata = JsonDataWrapper(data) except KeyError: return Response(u"No data. Nothing added.") except AttributeError as e: return Response(u"Not a valid request. Error was: {error}".format( error=str(e))) except Exception as e: return Response( u"Adding information failed. Error was: {error}".format( error=str(e))) host = Host.get_by_name(jsondata.hostname) if not host: host = Host.add(jsondata.hostname, jsondata.ipv4) self.add_buildout(jsondata, host, checksum) return Response(u'Added buildout information to Whiskers.')
def buildout_view(self): """Return a buildout specified by buildout_id.""" buildout_id = self.request.matchdict['buildout_id'] buildout = DBSession.query(Buildout).filter_by( id=int(buildout_id)).one() new_buildouts = DBSession.query(Buildout).\ join(Buildout.host).\ filter(Buildout.host == buildout.host, Buildout.name == buildout.name, Buildout.id != buildout_id, Buildout.datetime > buildout.datetime).\ order_by(Buildout.datetime).all() older_buildouts = DBSession.query(Buildout).join(Buildout.host).\ filter(Buildout.host == buildout.host, Buildout.name == buildout.name, Buildout.datetime < buildout.datetime, Buildout.id != buildout_id).\ order_by(Buildout.datetime).all() try: config = json.loads(buildout.config) except TypeError: config = None return { 'buildout': buildout, 'main': self.main, 'config': config, 'older_buildouts': older_buildouts, 'new_buildouts': new_buildouts }
def post(self): """Add a new buildout to database.""" try: data = self.request.params['data'] incoming = data.encode('utf-8') checksum = zlib.adler32(incoming) checksum_buildout = Buildout.get_by_checksum(checksum) if checksum_buildout: logging.info("Checksum matched") logging.info("Updating datetime..") checksum_buildout.datetime = datetime.now() DBSession.flush() raise Exception("No changes with existing data.") logging.info("New checksum") jsondata = JsonDataWrapper(data) except KeyError: return Response('No data. Nothing added.') except Exception as e: return Response(str(e)) host = Host.get_by_name(jsondata.hostname) if not host: host = Host.add(jsondata.hostname, jsondata.ipv4) self.add_buildout(jsondata, host, checksum) return Response('Added buildout information to Whiskers.')
def add_buildout(self, data, host, checksum): packages = [] for package_info in data.packages: package = Package.get_by_nameversion(package_info['name'], package_info['version']) if not package: equation = package_info.get('equation', None) version = Version.get_by_version(package_info['version']) or\ Version.add(package_info['version'], equation) requirements = self.get_requirements( package_info['requirements'], data.versionmap) package = Package.add(package_info['name'], version, requirements) packages.append(package) buildout = Buildout(data.name, host, checksum, started=data.started, finished=data.finished, packages=packages, config=data.config) DBSession.add(buildout) self.remove_old_buildouts(data.name) return buildout
def buildout_view(self): """Return a buildout specified by buildout_id.""" buildout_id = self.request.matchdict['buildout_id'] buildout = DBSession.query(Buildout).filter_by( id=int(buildout_id)).one() new_buildouts = DBSession.query(Buildout).join(Buildout.host).\ filter(Buildout.host == buildout.host, Buildout.name == buildout.name, Buildout.id != buildout_id, Buildout.datetime > buildout.datetime).\ order_by(Buildout.datetime).all() older_buildouts = DBSession.query(Buildout).join(Buildout.host).\ filter(Buildout.host == buildout.host, Buildout.name == buildout.name, Buildout.datetime < buildout.datetime, Buildout.id != buildout_id).\ order_by(Buildout.datetime).all() try: config = json.loads(buildout.config) except TypeError: config = None return {'buildout': buildout, 'main': self.main, 'config': config, 'older_buildouts': older_buildouts, 'new_buildouts': new_buildouts}
def post(self): """Add a new buildout to database.""" try: data = self.request.json_body['data'] checksum = zlib.adler32(self.request.body) checksum_buildout = Buildout.get_by_checksum(checksum) if checksum_buildout: logging.info("Checksum matched") logging.info("Updating datetime..") checksum_buildout.datetime = datetime.now() DBSession.flush() raise Exception("No changes with existing data.") logging.info("New checksum") jsondata = JsonDataWrapper(data) except KeyError: return Response(u"No data. Nothing added.") except AttributeError as e: return Response(u"Not a valid request. Error was: {error}".format( error=str(e))) except Exception as e: return Response(u"Adding information failed. Error was: {error}". format(error=str(e))) host = Host.get_by_name(jsondata.hostname) if not host: host = Host.add(jsondata.hostname, jsondata.ipv4) self.add_buildout(jsondata, host, checksum) return Response(u'Added buildout information to Whiskers.')
def remove_old_buildouts(self, name): """Remove old buildouts.""" buildouts_to_keep = Settings.get_buildouts_to_keep() buildouts = Buildout.get_by_name(name) if buildouts.count() > buildouts_to_keep and buildouts_to_keep > 0: for buildout in buildouts[buildouts_to_keep:]: DBSession.delete(buildout)
def buildout_view(request): main = get_renderer('whiskers:templates/master.pt').implementation() session = DBSession() buildout_id = request.matchdict['buildout_id'] buildout = session.query(Buildout).filter_by(id=int(buildout_id)).one() packages = session.query(Package).join(Package.buildouts).filter( Buildout.id == buildout_id).order_by(Package.name).all() return {'buildout': buildout, 'main': main, 'packages': packages}
def init_testing_db(): from whiskers.models import DBSession from whiskers.models import Base from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:') DBSession.configure(bind=engine) Base.metadata.bind = engine Base.metadata.create_all(engine) return DBSession
def add_version(package, version): """Add a new version and return its id""" existing_version = DBSession.query(Version).filter_by(version=version) if not existing_version.count(): new_version = Version(version) DBSession.merge() return new_version.id
def _initTestingDB(): from sqlalchemy import create_engine from whiskers.models import ( DBSession, Base, ) engine = create_engine('sqlite://') Base.metadata.create_all(engine) DBSession.configure(bind=engine) return DBSession
def get_version(version): """Returns version id for package""" session = DBSession() existing_version = session.query(Version).filter_by(version=version) if existing_version.count(): return existing_version.first().id else: new_version_id = add_version(version) return new_version_id
def post(self): """Save settings.""" try: buildouts_to_keep = int(self.request.params['buildouts_to_keep']) settings = DBSession.query(Settings).first() if not settings: settings = Settings(buildouts_to_keep) else: if buildouts_to_keep != settings.buildouts_to_keep: settings.buildouts_to_keep = buildouts_to_keep DBSession.add(settings) return HTTPFound(location=self.request.route_url('settings')) except: pass
def get_buildouts(self, host_id): """Return list of buildouts.""" results = DBSession.query(Buildout).\ filter(Buildout.host_id == host_id).\ group_by(Buildout.name).\ order_by(Buildout.datetime.desc()).all() return results
def get_buildouts_info(self): """Return list of dicts containing Buildout info.""" query = DBSession.query(Buildout).join(Buildout.host).\ group_by(Buildout.name).order_by(Buildout.datetime).\ all() return query
def get_unique_buildouts(self, host): """Return amount of buildouts (grouped by name).""" results = DBSession.query(Buildout).\ filter(Buildout.host == host).\ group_by(Buildout.name) return results.count()
def get_buildouts_info(self): """Return list of dicts containing Buildout info.""" query = DBSession.query(Buildout).\ join(Buildout.host).\ group_by(Buildout.name).\ order_by(Buildout.datetime).\ all() return query
def test_it(self): from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:') self._callFUT(engine) from whiskers.models import DBSession, Buildout, Package self._createDummyContent(DBSession) buildout = DBSession.query(Buildout).one() self.assertEqual(buildout.name, 'buildout') packages = ['package1', 'package2'] versions = ['1.0', '2.0'] buildout_packages = [i.name for i in buildout.packages] buildout_versions = [i.version.version for i in buildout.packages] self.assertEqual(packages.sort(), buildout_packages.sort()) self.assertEqual(versions.sort(), buildout_versions.sort()) p1 = DBSession.query(Package).filter(Package.name == 'package2').one() self.assertEqual(p1.requires[0].name, 'req-package-1') self.assertEqual(buildout.host.name, 'localhost')
def add_buildout_view(request): try: data = json.loads(request.params['data']) except KeyError: return Response('No data. Nothing added.') session = DBSession() buildoutname = data['buildoutname'] packages = data['packages'] prepared_packages = prepare_packages(session, packages) buildout = session.query(Buildout).filter_by(name=buildoutname) if not buildout.count(): buildout = Buildout(name=buildoutname, packages=prepared_packages) else: buildout = buildout[0] buildout.packages = prepared_packages session.merge(buildout) transaction.commit() return Response('OK')
def hosts_info(self): """Return list of dicts containing Host info.""" result_list = [] results = DBSession.query(Host).\ join(Buildout, Buildout.host_id == Host.id).all() for result in results: tmp = {'host': result, 'count': self.get_unique_buildouts(result)} result_list.append(tmp) return result_list
def package_view(request): main = get_renderer('whiskers:templates/master.pt').implementation() session = DBSession() package_name = request.matchdict['package_name'] package_id = request.matchdict['id'] results = session.query(Package).filter( Package.name == package_name) packages = results.all() packages = sort_versionnumbers(packages) if len(package_id) > 0: package = results.filter_by(id=int(package_id[0])).first() else: package = None if results.count() > 1: other_versions = True else: other_versions = False return {'packages': packages, 'package': package, 'package_name': package_name, 'main': main, 'other_versions': other_versions}
def get_hosts_info(self): """Return list of dicts containing Host info.""" result_list = [] results = DBSession.query(Host).\ join(Buildout, Buildout.host_id == Host.id).all() for result in results: tmp = {} tmp['host'] = result tmp['count'] = len(result.buildouts) result_list.append(tmp) return result_list
def test_it(self): from sqlalchemy import create_engine engine = create_engine("sqlite:///:memory:") self._callFUT(engine) from whiskers.models import DBSession, Buildout self._createDummyContent(DBSession) buildout = DBSession.query(Buildout).one() self.assertEqual(buildout.name, "buildout") packages = [u"package1", u"package2"] versions = [u"1.0", u"1.1"] buildout_packages = [i.name for i in buildout.packages] buildout_versions = [i.version for i in buildout.packages] self.assertEqual(packages.sort(), buildout_packages.sort()) self.assertEqual(versions.sort(), buildout_versions.sort())
def packages_view(request): main = get_renderer('whiskers:templates/master.pt').implementation() session = DBSession() packages = session.query(Package).group_by(Package.name).all() return {'packages': packages, 'project': 'whiskers', 'main': main}
def collection_get(self): """Return all buildouts as json.""" results = DBSession.query(Buildout).order_by(Buildout.name).all() results = [buildout.get_as_dict() for buildout in results] return {'buildouts': results}
def tearDown(self): from whiskers.models import DBSession DBSession.remove()
def setUp(self): from whiskers.models import DBSession DBSession.remove()
def collection_get(self): """Return all packages as json.""" results = DBSession.query(Package).order_by(Package.name).all() results = [package.get_as_dict() for package in results] return {'packages': results}
def buildouts_view(request): main = get_renderer('whiskers:templates/master.pt').implementation() session = DBSession() buildouts = session.query(Buildout).order_by(Buildout.name).all() return {'buildouts': buildouts, 'project': 'whiskers', 'main': main}
def collection_get(self): """Return all hosts as json.""" results = DBSession.query(Host).order_by(Host.name).all() results = [host.get_as_dict() for host in results] return {'hosts': results}
def delete_package(self): """Delete unused package.""" package_id = self.request.matchdict.get("id", None) package = DBSession.query(Package).filter(Package.id == package_id).first() DBSession.delete(package) return json.dumps(dict(result="OK"))
def delete_package(self): """Delete unused package.""" package_id = self.request.matchdict.get('id', None) package = DBSession.query(Package).filter(Package.id == package_id).first() DBSession.delete(package) return json.dumps(dict(result="OK"))
def version_view(request): main = get_renderer('whiskers:views/templates/master.pt').implementation() session = DBSession() version_id = request.matchdict['version_id'] version = session.query(Version).filter_by(id=int(version_id)).one() return {'version': version, 'main': main}