def testGetPatchStatusWithUnknownPatches(self): """ L{getPatchStatus} returns information about patch versions that exist in the database, but not in the code base. """ schema = createSchema(self.patchPackage) patchDatabase(self.store, schema) self.store.execute('INSERT INTO patch (version) VALUES (1)') status = getPatchStatus(self.store, schema) self.assertEqual([], status.unappliedPatches) self.assertEqual([1], status.unknownPatches)
def testGetPatchStatus(self): """ L{getPatchStatus} returns a L{PatchStatus} with information about outstanding and unknown patches. If the database is up-to-date and no unknown patches have been applied to it, both of these values are empty C{list}s. """ schema = createSchema(self.patchPackage) patchDatabase(self.store, schema) status = getPatchStatus(self.store, schema) self.assertEqual([], status.unappliedPatches) self.assertEqual([], status.unknownPatches)
def testGetPatchStatusWithUnappliedPatches(self): """ L{getPatchStatus} returns information about patch versions that need to be applied to a database to make it up-to-date with the code base. """ schema = createSchema(self.patchPackage) patchDatabase(self.store, schema) self.packageBuilder.createModule('patch_1', dedent("""\ def apply(store): store.execute('INSERT INTO person (name) VALUES (\\'Bob\\')') """)) status = getPatchStatus(self.store, schema) self.assertEqual([1], status.unappliedPatches) self.assertEqual([], status.unknownPatches)
def run(self, database_uri): setConfig(setupConfig(None)) setupLogging(self.outf) store = setupStore(database_uri, 'main') schema = main.createSchema() status = getPatchStatus(store, schema) if status.unappliedPatches: patches = ', '.join('patch_%d' % version for version in status.unappliedPatches) logging.info('Unapplied patches: %s' % patches) sys.exit(1) if status.unknownPatches: patches = ', '.join('patch_%d' % version for version in status.unknownPatches) logging.info('Unknown patches: %s' % patches) sys.exit(2) if not status.unappliedPatches and not status.unknownPatches: logging.info('Database is up-to-date.') sys.exit(0)
def run(self, database_uri): setConfig(setupConfig(None)) setupLogging(self.outf) store = setupStore(database_uri, 'main') schema = main.createSchema() status = getPatchStatus(store, schema) if status.unknownPatches: unknownPatches = ', '.join( 'patch_%d' % version for version in status.unknownPatches) logging.critical('Database has unknown patches: %s', unknownPatches) return 1 if status.unappliedPatches: unappliedPatches = ', '.join( 'patch_%d' % version for version in status.unappliedPatches) logging.info('Applying patches: %s', unappliedPatches) patchDatabase(store, schema) else: logging.info('Database is up-to-date.')
def run(self, database_uri): setConfig(setupConfig(None)) setupLogging(self.outf) store = setupStore(database_uri, 'main') schema = main.createSchema() status = getPatchStatus(store, schema) if status.unknownPatches: unknownPatches = ', '.join('patch_%d' % version for version in status.unknownPatches) logging.critical('Database has unknown patches: %s', unknownPatches) return 1 if status.unappliedPatches: unappliedPatches = ', '.join( 'patch_%d' % version for version in status.unappliedPatches) logging.info('Applying patches: %s', unappliedPatches) patchDatabase(store, schema) else: logging.info('Database is up-to-date.')
def verifyStore(): """Ensure that the patch level in the database matches the application. @raise RuntimeError: Raised if there are unknown or unapplied patches. """ from fluiddb.schema.main import createSchema from fluiddb.scripts.schema import getPatchStatus schema = createSchema() zstorm = getUtility(IZStorm) store = zstorm.get('main') try: status = getPatchStatus(store, schema) if status.unappliedPatches: patches = ', '.join('patch_%d' % version for version in status.unappliedPatches) raise RuntimeError('Database has unapplied patches: %s' % patches) if status.unknownPatches: patches = ', '.join('patch_%d' % version for version in status.unknownPatches) raise RuntimeError('Database has unknown patches: %s' % patches) finally: zstorm.remove(store) store.close()