AMBARI-20682. Wait For DataNodes To Shutdown During a Rolling Upgrade (dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/273dfcac Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/273dfcac Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/273dfcac Branch: refs/heads/branch-feature-AMBARI-12556 Commit: 273dfcac0296ebfaebd21484ea887acfe2a02067 Parents: ac75f1d Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Authored: Thu Apr 13 17:36:19 2017 +0300 Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Committed: Thu Apr 13 17:36:19 2017 +0300 ---------------------------------------------------------------------- .../libraries/script/script.py | 61 +++++++++++++++--- .../HIVE/package/scripts/mysql_service.py | 5 ++ .../HDFS/2.1.0.2.0/package/scripts/datanode.py | 45 ++++++++++++- .../package/scripts/datanode_upgrade.py | 38 +---------- .../HIVE/package/scripts/mysql_service.py | 5 +- .../HIVE/package/scripts/postgresql_service.py | 5 +- .../python/stacks/2.0.6/HDFS/test_datanode.py | 66 ++++++++++++++++---- 7 files changed, 164 insertions(+), 61 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-common/src/main/python/resource_management/libraries/script/script.py ---------------------------------------------------------------------- diff --git a/ambari-common/src/main/python/resource_management/libraries/script/script.py b/ambari-common/src/main/python/resource_management/libraries/script/script.py index 5fa9ec4..bad09d2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/script.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py @@ -28,6 +28,7 @@ import logging import platform import inspect import tarfile +import time from optparse import OptionParser import resource_management from ambari_commons import OSCheck, OSConst @@ -308,21 +309,36 @@ class Script(object): method = self.choose_method_to_execute(self.command_name) with Environment(self.basedir, tmp_dir=Script.tmp_dir) as env: env.config.download_path = Script.tmp_dir - - if self.command_name == "start" and not self.is_hook(): - self.pre_start() + + if not self.is_hook(): + self.execute_prefix_function(self.command_name, 'pre', env) method(env) - if self.command_name == "start" and not self.is_hook(): - self.post_start() + if not self.is_hook(): + self.execute_prefix_function(self.command_name, 'post', env) + except Fail as ex: ex.pre_raise() raise finally: if self.should_expose_component_version(self.command_name): self.save_component_version_to_structured_out() - + + def execute_prefix_function(self, command_name, afix, env): + """ + Execute action afix (prefix or suffix) based on command_name and afix type + example: command_name=start, afix=pre will result in execution of self.pre_start(env) if exists + """ + self_methods = dir(self) + method_name = "{0}_{1}".format(afix, command_name) + if not method_name in self_methods: + Logger.logger.debug("Action afix '{0}' not present".format(method_name)) + return + Logger.logger.debug("Execute action afix: {0}".format(method_name)) + method = getattr(self, method_name) + method(env) + def is_hook(self): from resource_management.libraries.script.hook import Hook return (Hook in self.__class__.__bases__) @@ -335,8 +351,11 @@ class Script(object): def get_pid_files(self): return [] - - def pre_start(self): + + def pre_start(self, env=None): + """ + Executed before any start method. Posts contents of relevant *.out files to command execution log. + """ if self.log_out_files: log_folder = self.get_log_folder() user = self.get_user() @@ -366,6 +385,32 @@ class Script(object): Logger.info("Component has started with pid(s): {0}".format(', '.join(pids))) + def post_stop(self, env): + """ + Executed after completion of every stop method. Waits until component is actually stopped (check is performed using + components status() method. + """ + self_methods = dir(self) + + if not 'status' in self_methods: + pass + status_method = getattr(self, 'status') + component_is_stopped = False + counter = 0 + while not component_is_stopped : + try: + if counter % 100 == 0: + Logger.logger.info("Waiting for actual component stop") + status_method(env) + time.sleep(0.1) + counter += 1 + except ComponentIsNotRunning, e: + Logger.logger.debug("'status' reports ComponentIsNotRunning") + component_is_stopped = True + except ClientComponentHasNoStatus, e: + Logger.logger.debug("Client component has no status") + component_is_stopped = True + def choose_method_to_execute(self, command_name): """ Returns a callable object that should be executed for a given command. http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py ---------------------------------------------------------------------- diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py index 4716343..cf1d30e 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py @@ -31,6 +31,11 @@ def mysql_service(daemon_name=None, action='start'): elif action == 'status': cmd = format('service {daemon_name} status') logoutput = False + try: + Execute(cmd) + return + except: + raise ComponentIsNotRunning() else: cmd = None http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py index 924eea4..cd52885 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py @@ -21,10 +21,13 @@ import datanode_upgrade from ambari_commons.constants import UPGRADE_TYPE_ROLLING from hdfs_datanode import datanode +from resource_management import Script, Fail, shell, Logger from resource_management.libraries.script.script import Script from resource_management.libraries.functions import conf_select, stack_select -from resource_management.libraries.functions.constants import StackFeature from resource_management.libraries.functions.stack_features import check_stack_feature +from resource_management.libraries.functions import StackFeature +from resource_management.libraries.functions import format +from resource_management.libraries.functions.decorator import retry from resource_management.libraries.functions.security_commons import build_expectations, \ cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, FILE_TYPE_XML from resource_management.core.logger import Logger @@ -32,6 +35,7 @@ from hdfs import hdfs from ambari_commons.os_family_impl import OsFamilyImpl from ambari_commons import OSConst from utils import get_hdfs_binary +from utils import get_dfsadmin_base_command class DataNode(Script): @@ -75,12 +79,51 @@ class DataNode(Script): datanode(action="stop") else: datanode(action="stop") + # verify that the datanode is down + self.check_datanode_shutdown(hdfs_binary) def status(self, env): import status_params env.set_params(status_params) datanode(action = "status") + @retry(times=24, sleep_time=5, err_class=Fail) + def check_datanode_shutdown(self, hdfs_binary): + """ + Checks that a DataNode is down by running "hdfs dfsamin getDatanodeInfo" + several times, pausing in between runs. Once the DataNode stops responding + this method will return, otherwise it will raise a Fail(...) and retry + automatically. + The stack defaults for retrying for HDFS are also way too slow for this + command; they are set to wait about 45 seconds between client retries. As + a result, a single execution of dfsadmin will take 45 seconds to retry and + the DataNode may be marked as dead, causing problems with HBase. + https://issues.apache.org/jira/browse/HDFS-8510 tracks reducing the + times for ipc.client.connect.retry.interval. In the meantime, override them + here, but only for RU. + :param hdfs_binary: name/path of the HDFS binary to use + :return: + """ + import params + + # override stock retry timeouts since after 30 seconds, the datanode is + # marked as dead and can affect HBase during RU + dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) + command = format('{dfsadmin_base_command} -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo {dfs_dn_ipc_address}') + + is_datanode_deregistered = False + try: + shell.checked_call(command, user=params.hdfs_user, tries=1) + except: + is_datanode_deregistered = True + + if not is_datanode_deregistered: + Logger.info("DataNode has not yet deregistered from the NameNode...") + raise Fail('DataNode has not yet deregistered from the NameNode...') + + Logger.info("DataNode has successfully shutdown.") + return True + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) class DataNodeDefault(DataNode): http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py index b55237d..c1b0296 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py @@ -48,10 +48,7 @@ def pre_rolling_upgrade_shutdown(hdfs_binary): command = format('{dfsadmin_base_command} -shutdownDatanode {dfs_dn_ipc_address} upgrade') code, output = shell.call(command, user=params.hdfs_user) - if code == 0: - # verify that the datanode is down - _check_datanode_shutdown(hdfs_binary) - else: + if code != 0: # Due to bug HDFS-7533, DataNode may not always shutdown during stack upgrade, and it is necessary to kill it. if output is not None and re.search("Shutdown already in progress", output): Logger.error("Due to a known issue in DataNode, the command {0} did not work, so will need to shutdown the datanode forcefully.".format(command)) @@ -84,39 +81,6 @@ def is_datanode_process_running(): except ComponentIsNotRunning: return False -@retry(times=24, sleep_time=5, err_class=Fail) -def _check_datanode_shutdown(hdfs_binary): - """ - Checks that a DataNode is down by running "hdfs dfsamin getDatanodeInfo" - several times, pausing in between runs. Once the DataNode stops responding - this method will return, otherwise it will raise a Fail(...) and retry - automatically. - The stack defaults for retrying for HDFS are also way too slow for this - command; they are set to wait about 45 seconds between client retries. As - a result, a single execution of dfsadmin will take 45 seconds to retry and - the DataNode may be marked as dead, causing problems with HBase. - https://issues.apache.org/jira/browse/HDFS-8510 tracks reducing the - times for ipc.client.connect.retry.interval. In the meantime, override them - here, but only for RU. - :param hdfs_binary: name/path of the HDFS binary to use - :return: - """ - import params - - # override stock retry timeouts since after 30 seconds, the datanode is - # marked as dead and can affect HBase during RU - dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) - command = format('{dfsadmin_base_command} -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo {dfs_dn_ipc_address}') - - try: - Execute(command, user=params.hdfs_user, tries=1) - except: - Logger.info("DataNode has successfully shutdown for upgrade.") - return - - Logger.info("DataNode has not shutdown.") - raise Fail('DataNode has not shutdown.') - @retry(times=30, sleep_time=30, err_class=Fail) # keep trying for 15 mins def _check_datanode_startup(hdfs_binary): http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py index 11bbdd8..a4f3bbb 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py @@ -26,7 +26,10 @@ def mysql_service(daemon_name=None, action='start'): cmd = format('service {daemon_name} {action}') if action == 'status': - Execute(status_cmd) + try: + Execute(status_cmd) + except: + raise ComponentIsNotRunning() elif action == 'stop': Execute(cmd, logoutput = True, http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py index cc7b4cc..41fe107 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py @@ -26,7 +26,10 @@ def postgresql_service(postgresql_daemon_name=None, action='start'): cmd = format('service {postgresql_daemon_name} {action}') if action == 'status': - Execute(status_cmd) + try: + Execute(status_cmd) + except: + raise ComponentIsNotRunning() elif action == 'stop': Execute(cmd, logoutput = True, http://git-wip-us.apache.org/repos/asf/ambari/blob/273dfcac/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py index 1c3c5b7..2cd35ab 100644 --- a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py +++ b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py @@ -22,6 +22,7 @@ import json from mock.mock import MagicMock, patch from resource_management.libraries.script.script import Script from resource_management.core import shell +import itertools from resource_management.core.exceptions import Fail import resource_management.libraries.functions.mounted_dirs_helper @@ -76,13 +77,21 @@ class TestDatanode(RMFTestCase): ) self.assertNoMoreResources() + @patch('time.sleep') @patch("os.path.exists", new = MagicMock(return_value=False)) - def test_stop_default(self): + @patch("resource_management.core.shell.checked_call") + def test_stop_default(self, checked_call_mock, time_mock): + def side_effect(arg): + if '-D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo' in arg : + raise Fail() + return + checked_call_mock.side_effect = side_effect self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/datanode.py", classname = "DataNode", command = "stop", config_file = "default.json", stack_version = self.STACK_VERSION, + checked_call_mocks = side_effect, target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode'", @@ -221,13 +230,21 @@ class TestDatanode(RMFTestCase): ) self.assertNoMoreResources() + @patch('time.sleep') @patch("os.path.exists", new = MagicMock(return_value=False)) - def test_stop_secured(self): + @patch("resource_management.core.shell.checked_call") + def test_stop_secured(self, checked_call_mock, time_mock): + def side_effect(arg): + if '-D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo' in arg : + raise Fail() + return + checked_call_mock.side_effect = side_effect self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/datanode.py", classname = "DataNode", command = "stop", config_file = "secured.json", stack_version = self.STACK_VERSION, + checked_call_mocks = side_effect, target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode', @@ -237,9 +254,15 @@ class TestDatanode(RMFTestCase): self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-datanode.pid', action = ['delete']) self.assertNoMoreResources() - + @patch('time.sleep') @patch("os.path.exists", new = MagicMock(return_value=False)) - def test_stop_secured_HDP22_root(self): + @patch("resource_management.core.shell.checked_call") + def test_stop_secured_HDP22_root(self, checked_call_mock, time_mock): + def side_effect(arg): + if '-D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo' in arg : + raise Fail() + return + checked_call_mock.side_effect = side_effect config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/secured.json" with open(config_file, "r") as f: secured_json = json.load(f) @@ -251,6 +274,7 @@ class TestDatanode(RMFTestCase): command = "stop", config_dict = secured_json, stack_version = self.STACK_VERSION, + checked_call_mocks = side_effect, target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh --config /usr/hdp/current/hadoop-client/conf stop datanode', @@ -260,8 +284,15 @@ class TestDatanode(RMFTestCase): self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-datanode.pid', action = ['delete']) self.assertNoMoreResources() + @patch('time.sleep') @patch("os.path.exists", new = MagicMock(return_value=False)) - def test_stop_secured_HDP22_non_root_https_only(self): + @patch("resource_management.core.shell.checked_call") + def test_stop_secured_HDP22_non_root_https_only(self, checked_call_mock, time_mock): + def side_effect(arg): + if '-D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo' in arg : + raise Fail() + return + checked_call_mock.side_effect = side_effect config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/secured.json" with open(config_file, "r") as f: secured_json = json.load(f) @@ -276,6 +307,7 @@ class TestDatanode(RMFTestCase): command = "stop", config_dict = secured_json, stack_version = self.STACK_VERSION, + checked_call_mocks = side_effect, target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh --config /usr/hdp/current/hadoop-client/conf stop datanode'", @@ -564,7 +596,7 @@ class TestDatanode(RMFTestCase): @patch("resource_management.core.shell.call") @patch('time.sleep') - def test_stop_during_upgrade(self, time_mock, call_mock): + def test_stop_during_upgrade_not_shutdown(self, time_mock, call_mock): config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" call_mock_side_effects = [(0, ""), ] call_mock.side_effects = call_mock_side_effects @@ -573,7 +605,7 @@ class TestDatanode(RMFTestCase): version = '2.2.1.0-3242' json_content['commandParams']['version'] = version - + mocks_dict={} try: self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/datanode.py", classname = "DataNode", @@ -582,19 +614,23 @@ class TestDatanode(RMFTestCase): stack_version = self.STACK_VERSION, target = RMFTestCase.TARGET_COMMON_SERVICES, call_mocks = call_mock_side_effects, + checked_call_mocks=itertools.cycle([(0, "OK.")]), + mocks_dict = mocks_dict, command_args=["rolling"]) raise Fail("Expected a fail since datanode didn't report a shutdown") except Exception, err: - expected_message = "DataNode has not shutdown." + expected_message = "DataNode has not yet deregistered from the NameNode..." if str(err.message) != expected_message: self.fail("Expected this exception to be thrown. " + expected_message + ". Got this instead, " + str(err.message)) - self.assertResourceCalled("Execute", "hdfs dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010", tries=1, user="hdfs") + self.assertEquals( + ('hdfs dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010'), + mocks_dict['checked_call'].call_args_list[0][0][0]) @patch("resource_management.core.shell.call") @patch('time.sleep') - def test_stop_during_upgrade(self, time_mock, call_mock): + def test_stop_during_upgrade_not_shutdown_ha(self, time_mock, call_mock): config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/ha_default.json" call_mock_side_effects = [(0, ""), ] call_mock.side_effects = call_mock_side_effects @@ -603,7 +639,7 @@ class TestDatanode(RMFTestCase): version = '2.2.1.0-3242' json_content['commandParams']['version'] = version - + mocks_dict={} try: self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/datanode.py", classname = "DataNode", @@ -612,15 +648,19 @@ class TestDatanode(RMFTestCase): stack_version = self.STACK_VERSION, target = RMFTestCase.TARGET_COMMON_SERVICES, call_mocks = call_mock_side_effects, + checked_call_mocks=itertools.cycle([(0, "OK.")]), + mocks_dict = mocks_dict, command_args=["rolling"]) raise Fail("Expected a fail since datanode didn't report a shutdown") except Exception, err: - expected_message = "DataNode has not shutdown." + expected_message = "DataNode has not yet deregistered from the NameNode..." if str(err.message) != expected_message: self.fail("Expected this exception to be thrown. " + expected_message + ". Got this instead, " + str(err.message)) - self.assertResourceCalled("Execute", "hdfs dfsadmin -fs hdfs://ns1 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010", tries=1, user="hdfs") + self.assertEquals( + ('hdfs dfsadmin -fs hdfs://ns1 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010'), + mocks_dict['checked_call'].call_args_list[0][0][0]) @patch("resource_management.libraries.functions.security_commons.build_expectations") @patch("resource_management.libraries.functions.security_commons.get_params_from_filesystem")