def test_20_createDbFail(self): """ Test for creating database """ # instantiate CSS with some initial data initData = """\ /\t\\N /css_meta\t\\N /css_meta/version\t{version} /DBS\t\\N /DBS/DB1\tPENDING_CREATE:12345 """ wCss = _makeWcss(initData) executor = TestExecutor(None) watcher = watcherLib.Watcher(wCss, executor) watcher.run(True) self.assertEqual(executor.lastCall, "CREATE DATABASE DB1") self.assertEqual(executor.lastOptions, "12345") self.assertEqual(wCss.getDbs()['DB1'], "FAILED:CREATE DATABASE DB1")
def test_31_dropDbSkip(self): """ Test for dropping database """ # instantiate CSS with some initial data initData = """\ /\t\\N /css_meta\t\\N /css_meta/version\t{version} /DBS\t\\N /DBS/DB1\tPENDING_DROP:12345 """ wCss = _makeWcss(initData) executor = TestExecutor(False) watcher = watcherLib.Watcher(wCss, executor) watcher.run(True) self.assertEqual(executor.lastCall, "DROP DATABASE DB1") self.assertEqual(executor.lastOptions, "12345") self.assertEqual(wCss.getDbs()['DB1'], "PENDING_DROP:12345")
def test_13_dropTable(self): """ Test for dropping table """ # instantiate CSS with some initial data initData = """\ /\t\\N /css_meta\t\\N /css_meta/version\t{version} /DBS\t\\N /DBS/DB1\tREADY /DBS/DB1/TABLES\t\\N /DBS/DB1/TABLES/TABLE1\tPENDING_DROP:12345 """ wCss = _makeWcss(initData) executor = TestExecutor() watcher = watcherLib.Watcher(wCss, executor) watcher.run(True) self.assertEqual(executor.lastCall, "DROP TABLE DB1.TABLE1") self.assertEqual(executor.lastOptions, "12345") self.assertNotIn(('DB1', 'TABLE1'), wCss.getTables())
def test_32_createTableSkip(self): """ Test for creating table """ # instantiate CSS with some initial data initData = """\ /\t\\N /css_meta\t\\N /css_meta/version\t{version} /DBS\t\\N /DBS/DB1\tREADY /DBS/DB1/TABLES\t\\N /DBS/DB1/TABLES/TABLE1\tPENDING_CREATE:12345 """ wCss = _makeWcss(initData) executor = TestExecutor(False) watcher = watcherLib.Watcher(wCss, executor) watcher.run(True) self.assertEqual(executor.lastCall, "CREATE TABLE DB1.TABLE1") self.assertEqual(executor.lastOptions, "12345") self.assertEqual(wCss.getTables()[('DB1', 'TABLE1')], "PENDING_CREATE:12345")
def main(): descr = 'Synchronize database contents with CSS.' parser = ArgumentParser(description=descr) parser.add_argument('-v', '--verbose', dest='verbose', action='count', default=0, help='More verbose output, can use several times.') parser.add_argument( '-c', '--config', dest='configFile', default='./watcher.cfg', metavar='PATH', help='Read configuration from provided file, def: %(default)s.') args = parser.parse_args() # configure logging levels = {0: lsst.log.WARN, 1: lsst.log.INFO, 2: lsst.log.DEBUG} level = levels.get(args.verbose, lsst.log.DEBUG) lsst.log.setLevel('', level) # redirect Python logging to LSST logger pylgr = logging.getLogger() pylgr.setLevel(logging.DEBUG) pylgr.addHandler(lsst.log.LogHandler()) logging.captureWarnings(True) # parameters interval = 3.0 # scan interval in seconds wmgrSecret = None extraCzar = None # parse config file defaults = dict(interval=str(interval)) cfg = configparser.SafeConfigParser(defaults) cfg.readfp(open(args.configFile)) # get few parameters if cfg.has_section('watcher'): interval = cfg.getfloat('watcher', 'interval') wmgrSecret = cfg.get('wmgr', 'secret') if cfg.has_option('czar_wmgr', 'host'): host = cfg.get('czar_wmgr', 'host') port = 5012 if cfg.has_option('czar_wmgr', 'port'): port = cfg.getint('czar_wmgr', 'port') extraCzar = (host, port) # instantiate CSS cssConfig = dict(cfg.items('css')) wcss = watcherLib.WatcherCss(cssConfig, wmgrSecret, extraCzar) # instantiate executor qmetaConfig = dict(cfg.items('qmeta')) executor = watcherLib.QservExecutor(wcss, qmetaConfig) # start watcher, this will not return watcher = watcherLib.Watcher(wcss, executor, interval) watcher.run()