def save_plugin_configuration(plugin_ref) -> Response: """ Endpoint for persisting a plugin configuration """ project = Project.find() payload = request.get_json() plugins_service = ProjectPluginsService(project) plugin = plugins_service.get_plugin(plugin_ref) settings = PluginSettingsService(project, plugin, plugins_service=plugins_service, show_hidden=False) config = payload.get("config", {}) for name, value in config.items(): if not validate_plugin_config(plugin, name, value, project, settings): continue if value == "": settings.unset(name, session=db.session) else: settings.set(name, value, session=db.session) return jsonify(get_config_with_metadata(settings))
def get_plugin_configuration(plugin_ref) -> Response: """ Endpoint for getting a plugin's configuration """ project = Project.find() plugins_service = ProjectPluginsService(project) plugin = plugins_service.get_plugin(plugin_ref) settings = PluginSettingsService(project, plugin, plugins_service=plugins_service, show_hidden=False) try: settings_group_validation = plugin.settings_group_validation except PluginNotFoundError: settings_group_validation = [] return jsonify({ **get_config_with_metadata(settings), "settings": Canonical.as_canonical(settings.definitions(extras=False)), "settings_group_validation": settings_group_validation, })
def test_plugin_configuration(plugin_ref) -> Response: """ Endpoint for testing a plugin configuration's valid connection """ project = Project.find() payload = request.get_json() plugins_service = ProjectPluginsService(project) plugin = plugins_service.get_plugin(plugin_ref) settings = PluginSettingsService(project, plugin, plugins_service=plugins_service, show_hidden=False) config = payload.get("config", {}) valid_config = { name: value for name, value in config.items() if validate_plugin_config(plugin, name, value, project, settings) } settings.config_override = PluginSettingsService.unredact(valid_config) async def test_stream(tap_stream) -> bool: while not tap_stream.at_eof(): message = await tap_stream.readline() json_dict = json.loads(message) if json_dict["type"] == "RECORD": return True return False async def test_extractor(): process = None try: invoker = invoker_factory( project, plugin, plugins_service=plugins_service, plugin_settings_service=settings, ) with invoker.prepared(db.session): process = await invoker.invoke_async( stdout=asyncio.subprocess.PIPE) return await test_stream(process.stdout) except Exception as err: logging.debug(err) # if anything happens, this is not successful return False finally: try: if process: psutil.Process(process.pid).terminate() except Exception as err: logging.debug(err) loop = asyncio.get_event_loop() success = loop.run_until_complete(test_extractor()) return jsonify({"is_success": success}), 200