def test_emission_queuing(): plugin.instantiate(config["plugin"], None) queue_tester = plugin.get_instance("queue_tester") emit_store1 = plugin.get_output("emit_store1", None) emit_store2 = plugin.get_output("emit_store2", None) # daemon handles this, do it manually here since # we are not starting the daemon queue_tester._emit = [emit_store1, emit_store2] message = queue_tester.probe() queue_tester.queue_emission(message) queue_tester.send_emission() assert emit_store1.store[0] == message assert emit_store2.store == [] queue_tester.send_emission() assert emit_store1.store[0] == message assert len(emit_store1.store) == 1 assert emit_store2.store[0] == message assert len(emit_store2.store) == 1 assert queue_tester._emit_queue.qsize() == 0 message = queue_tester.probe() queue_tester.queue_emission(message) queue_tester.emit_all() assert len(emit_store1.store) == 2 assert len(emit_store2.store) == 2 assert queue_tester._emit_queue.qsize() == 0
def __init__(self, config=None, config_dir=None): if config: if not config.meta: raise ValueError( "no config specified, please use specify a home directory") self.config = config elif config_dir: self.config = vaping.Config(read=config_dir) else: raise ValueError( "no config specified, please use specify a home directory") self.joins = [] self._logger = None self.plugin_context = PluginContext(self.config) vcfg = self.config.get('vaping', {}) # change to home for working dir self.home_dir = os.path.abspath(self.config.meta['config_dir']) os.chdir(self.home_dir) # instantiate all defined plugins # TODO remove and let them lazy init? plugins = self.config.get('plugins', None) if not plugins: raise ValueError('no plugins specified') plugin.instantiate(self.config['plugins'], self.plugin_context) # TODO move to daemon pidname = vcfg.get('pidfile', 'vaping.pid') self.pidfile = pidfile.PidFile(pidname=pidname, piddir=self.home_dir)
def __init__(self, config=None, config_dir=None): """ must either pass config as a dict or vaping.config.Config or config_dir as a path to where the config dir is located """ self.joins = [] self._logger = None self.load_config(config, config_dir) self.validate_config_data(self.config.data) # configure vaping logging if "logging" in self.config: logging.config.dictConfig(self.config.get("logging")) self.plugin_context = PluginContext(self.config) # GET VAPING PART OF CONFIG vcfg = self.config.get("vaping", None) if not vcfg: vcfg = dict() # GET HOME_DIR PART OF CONFIG # get either home_dir from config, or use config_dir self.home_dir = vcfg.get("home_dir", None) if not self.home_dir: # self.home_dir = self.config.meta["config_dir"] self.home_dir = self.config["config_dir"] self.home_dir = os.path.abspath(self.home_dir) if not os.path.exists(self.home_dir): raise ValueError( f"home directory '{self.home_dir}' does not exist") if not os.access(self.home_dir, os.W_OK): raise ValueError( f"home directory '{self.home_dir}' is not writable") # change to home for working dir os.chdir(self.home_dir) # instantiate all defined plugins # TODO remove and let them lazy init? plugins = self.config.get("plugins", None) if not plugins: raise ValueError("no plugins specified") plugin.instantiate(self.config["plugins"], self.plugin_context) # check that probes don't name clash with plugins for probe in self.config.get("probes", []): if plugin.exists(probe["name"]): raise ValueError( "probes may not share names with plugins ({})".format( probe["name"])) self.pidname = vcfg.get("pidfile", "vaping.pid")
def __init__(self, config=None, config_dir=None): """ must either pass config as a dict or vaping.config.Config or config_dir as a path to where the config dir is located """ if config: if isinstance(config, dict): self.config = vaping.Config(data=config) else: if not config.meta: raise ValueError("config was not specified or empty") self.config = config elif config_dir: self.config = vaping.Config(read=config_dir) else: raise ValueError("config was not specified or empty") self.joins = [] self._logger = None self.plugin_context = PluginContext(self.config) vcfg = self.config.get('vaping', None) if not vcfg: vcfg = dict() # get either home_dir from config, or use config_dir self.home_dir = vcfg.get('home_dir', None) if not self.home_dir: self.home_dir = self.config.meta['config_dir'] if not os.path.exists(self.home_dir): raise ValueError("home directory '{}' does not exist".format( self.home_dir)) if not os.access(self.home_dir, os.W_OK): raise ValueError("home directory '{}' is not writable".format( self.home_dir)) # change to home for working dir os.chdir(self.home_dir) # instantiate all defined plugins # TODO remove and let them lazy init? plugins = self.config.get('plugins', None) if not plugins: raise ValueError('no plugins specified') plugin.instantiate(self.config['plugins'], self.plugin_context) # check that probes don't name clash with plugins for probe in self.config.get('probes', []): if plugin.exists(probe["name"]): raise ValueError( "probes may not share names with plugins ({})".format( probe["name"])) # TODO move to daemon pidname = vcfg.get('pidfile', 'vaping.pid') self.pidfile = pidfile.PidFile(pidname=pidname, piddir=self.home_dir)
def __init__(self, config=None, config_dir=None): """ must either pass config as a dict or vaping.config.Config or config_dir as a path to where the config dir is located """ if config: if isinstance(config, dict): self.config = vaping.Config(data=config) else: if not config.meta: raise ValueError("config was not specified or empty") self.config = config elif config_dir: self.config = vaping.Config(read=config_dir) else: raise ValueError("config was not specified or empty") self.joins = [] self._logger = None self.plugin_context = PluginContext(self.config) vcfg = self.config.get('vaping', None) if not vcfg: vcfg = dict() # get either home_dir from config, or use config_dir self.home_dir = vcfg.get('home_dir', None) if not self.home_dir: self.home_dir = self.config.meta['config_dir'] if not os.path.exists(self.home_dir): raise ValueError("home directory '{}' does not exist".format(self.home_dir)) if not os.access(self.home_dir, os.W_OK): raise ValueError("home directory '{}' is not writable".format(self.home_dir)) # change to home for working dir os.chdir(self.home_dir) # instantiate all defined plugins # TODO remove and let them lazy init? plugins = self.config.get('plugins', None) if not plugins: raise ValueError('no plugins specified') plugin.instantiate(self.config['plugins'], self.plugin_context) # check that probes don't name clash with plugins for probe in self.config.get('probes', []): if plugin.exists(probe["name"]): raise ValueError("probes may not share names with plugins ({})".format(probe["name"])) # TODO move to daemon pidname = vcfg.get('pidfile', 'vaping.pid') self.pidfile = pidfile.PidFile(pidname=pidname, piddir=self.home_dir)
def test_emission_queuing(): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) plugin.instantiate(config["plugin"], None) queue_tester = plugin.get_instance("queue_tester") emit_store1 = plugin.get_output("emit_store1", None) emit_store2 = plugin.get_output("emit_store2", None) # plugins = [queue_tester, emit_store1, emit_store2] # daemon handles this, do it manually here since # we are not starting the daemon queue_tester._emit = [emit_store1, emit_store2] message = queue_tester.probe() asyncio.run(queue_tester.queue_emission(message)) asyncio.run(queue_tester.send_emission()) assert emit_store1.store[0] == message assert emit_store2.store == [] asyncio.run(queue_tester.send_emission()) assert emit_store1.store[0] == message assert len(emit_store1.store) == 1 assert emit_store2.store[0] == message assert len(emit_store2.store) == 1 assert queue_tester._emit_queue.qsize() == 0 message = queue_tester.probe() asyncio.run(queue_tester.queue_emission(message)) asyncio.run(queue_tester.emit_all()) assert len(emit_store1.store) == 2 assert len(emit_store2.store) == 2 assert queue_tester._emit_queue.qsize() == 0 loop.close()
def test_plugin_instance(): with pytest.raises(ValueError): plugin.new_plugin({}, None) with pytest.raises(ValueError): plugin.get_instance('nonexistant', None) with pytest.raises(ValueError): plugin.get_instance(['unparsable'], None) plugin.instantiate(config['plugin'], None) for each in config['plugin']: if 'name' not in each: continue obj = plugin.get_instance(each['name'], None) for k, v in list(each.items()): assert v == obj.config[k] obj = plugin.get_instance(anon_config, None) assert obj.config == anon_config # copy ctor obj = plugin.get_instance('fancy_copy', None) assert 'reeb' == obj.config['str0'] obj = plugin.get_instance({'fancy_copy': {'var0': 'luggage'}}, None) assert 'reeb' == obj.config['str0'] with pytest.raises(TypeError): plugin.get_probe('emit0', None) assert None != plugin.get_probe('probe1', None) assert not hasattr(plugin.get_probe('probe1', None), 'emit') with pytest.raises(TypeError): plugin.get_output('emit_abc', None) with pytest.raises(TypeError): plugin.get_output('probe1', None) assert None != plugin.get_output('emit0', None)
def test_plugin_instance(): with pytest.raises(ValueError): plugin.new_plugin({}, None) with pytest.raises(ValueError): plugin.get_instance("nonexistant", None) with pytest.raises(ValueError): plugin.get_instance(["unparsable"], None) plugin.instantiate(config["plugin"], None) for each in config["plugin"]: if "name" not in each: continue obj = plugin.get_instance(each["name"], None) for k, v in list(each.items()): assert v == obj.config[k] obj = plugin.get_instance(anon_config, None) assert obj.config == anon_config # copy ctor obj = plugin.get_instance("fancy_copy", None) assert "reeb" == obj.config["str0"] obj = plugin.get_instance({"fancy_copy": {"var0": "luggage"}}, None) assert "reeb" == obj.config["str0"] with pytest.raises(TypeError): plugin.get_probe("emit0", None) assert plugin.get_probe("probe1", None) is not None assert not hasattr(plugin.get_probe("probe1", None), "emit") with pytest.raises(TypeError): plugin.get_output("emit_abc", None) with pytest.raises(TypeError): plugin.get_output("probe1", None) assert plugin.get_output("emit0", None) is not None
def test_plugin_instance(): with pytest.raises(ValueError): plugin.new_plugin({}, None) with pytest.raises(ValueError): plugin.get_instance('nonexistant', None) with pytest.raises(ValueError): plugin.get_instance(['unparsable'], None) plugin.instantiate(config['plugin'], None) for each in config['plugin']: if 'name' not in each: continue obj = plugin.get_instance(each['name'], None) for k,v in list(each.items()): assert v == obj.config[k] obj = plugin.get_instance(anon_config, None) assert obj.config == anon_config # copy ctor obj = plugin.get_instance('fancy_copy', None) assert 'reeb' == obj.config['str0'] obj = plugin.get_instance({'fancy_copy': {'var0': 'luggage'}}, None) assert 'reeb' == obj.config['str0'] with pytest.raises(TypeError): plugin.get_probe('emit0', None) assert None != plugin.get_probe('probe1', None) assert not hasattr(plugin.get_probe('probe1', None), 'emit') with pytest.raises(TypeError): plugin.get_output('emit_abc', None) with pytest.raises(TypeError): plugin.get_output('probe1', None) assert None != plugin.get_output('emit0', None)