diff --git a/unit_tests/falco/test_configuration.cpp b/unit_tests/falco/test_configuration.cpp index 4c0d936e..04132918 100644 --- a/unit_tests/falco/test_configuration.cpp +++ b/unit_tests/falco/test_configuration.cpp @@ -37,6 +37,8 @@ static std::string sample_yaml = " - elem2\n" " - elem3\n"; +static std::vector loaded_conf_files; + TEST(Configuration, configuration_exceptions) { yaml_helper conf; @@ -136,7 +138,7 @@ TEST(Configuration, configuration_config_files_secondary_fail) outfile.close(); yaml_helper conf; - ASSERT_ANY_THROW(conf.load_from_file("main.yaml")); + ASSERT_ANY_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); std::filesystem::remove("main.yaml"); std::filesystem::remove("conf_2.yaml"); @@ -183,7 +185,10 @@ TEST(Configuration, configuration_config_files_ok) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + conf_2 + conf_3 + ASSERT_EQ(loaded_conf_files.size(), 3); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); @@ -252,7 +257,10 @@ TEST(Configuration, configuration_config_files_relative_main) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file(temp_main.string())); + ASSERT_NO_THROW(conf.load_from_file(temp_main.string(), loaded_conf_files)); + + // main + conf_3 + ASSERT_EQ(loaded_conf_files.size(), 2); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); @@ -302,7 +310,10 @@ TEST(Configuration, configuration_config_files_override) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + conf_2 + conf_3 + ASSERT_EQ(loaded_conf_files.size(), 3); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); @@ -335,7 +346,10 @@ TEST(Configuration, configuration_config_files_unexistent) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + ASSERT_EQ(loaded_conf_files.size(), 1); ASSERT_TRUE(conf.is_defined("base_value.id")); ASSERT_EQ(conf.get_scalar("base_value.id", 0), 1); @@ -368,7 +382,10 @@ TEST(Configuration, configuration_config_files_scalar_configs_files) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + conf_2 + ASSERT_EQ(loaded_conf_files.size(), 2); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); @@ -400,7 +417,10 @@ TEST(Configuration, configuration_config_files_empty_configs_files) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + ASSERT_EQ(loaded_conf_files.size(), 1); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); @@ -427,7 +447,7 @@ TEST(Configuration, configuration_config_files_self) outfile.close(); yaml_helper conf; - ASSERT_ANY_THROW(conf.load_from_file("main.yaml")); + ASSERT_ANY_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); std::filesystem::remove("main.yaml"); } @@ -479,7 +499,10 @@ TEST(Configuration, configuration_config_files_directory) outfile.close(); yaml_helper conf; - ASSERT_NO_THROW(conf.load_from_file("main.yaml")); + ASSERT_NO_THROW(conf.load_from_file("main.yaml", loaded_conf_files)); + + // main + conf_2 + conf_3 + ASSERT_EQ(loaded_conf_files.size(), 3); ASSERT_TRUE(conf.is_defined("foo")); ASSERT_EQ(conf.get_scalar("foo", ""), "bar"); diff --git a/userspace/falco/configuration.cpp b/userspace/falco/configuration.cpp index 2e069243..ece5d6dd 100644 --- a/userspace/falco/configuration.cpp +++ b/userspace/falco/configuration.cpp @@ -94,9 +94,10 @@ void falco_configuration::init(const std::vector& cmdline_options) void falco_configuration::init(const std::string& conf_filename, const std::vector &cmdline_options) { yaml_helper config; + std::vector loaded_files; try { - config.load_from_file(conf_filename); + config.load_from_file(conf_filename, loaded_files); } catch(const std::exception& e) { @@ -106,6 +107,13 @@ void falco_configuration::init(const std::string& conf_filename, const std::vect init_cmdline_options(config, cmdline_options); load_yaml(conf_filename, config); + + // Here we have already set up correct logging level + falco_logger::log(falco_logger::level::DEBUG, "Loaded config filenames:\n"); + for (const auto& path : loaded_files) + { + falco_logger::log(falco_logger::level::DEBUG, std::string(" ") + path + "\n"); + } } void falco_configuration::load_engine_config(const std::string& config_name, const yaml_helper& config) diff --git a/userspace/falco/yaml_helper.h b/userspace/falco/yaml_helper.h index e5ee51e0..b1b56e5e 100644 --- a/userspace/falco/yaml_helper.h +++ b/userspace/falco/yaml_helper.h @@ -92,9 +92,10 @@ public: /** * Load the YAML document from the given file path. */ - void load_from_file(const std::string& path) + void load_from_file(const std::string& path, std::vector& loaded_config_files) { - m_root = load_from_file_int(path); + loaded_config_files.clear(); + m_root = load_from_file_int(path, loaded_config_files); const auto ppath = std::filesystem::path(path); const auto config_folder = ppath.parent_path(); @@ -120,7 +121,7 @@ public: { if (std::filesystem::is_regular_file(include_file_path)) { - include_config_file(include_file_path.string()); + include_config_file(include_file_path.string(), loaded_config_files); } else if (std::filesystem::is_directory(include_file_path)) { @@ -138,11 +139,11 @@ public: { falco_logger::log(falco_logger::level::WARNING, "Included config file has wrong type: " + dir_entry.path().string()); } - std::sort(v.begin(), v.end()); - for (const auto &f : v) - { - include_config_file(f); - } + } + std::sort(v.begin(), v.end()); + for (const auto &f : v) + { + include_config_file(f, loaded_config_files); } } else @@ -215,16 +216,17 @@ public: private: YAML::Node m_root; - YAML::Node load_from_file_int(const std::string& path) + YAML::Node load_from_file_int(const std::string& path, std::vector& loaded_config_files) { auto root = YAML::LoadFile(path); pre_process_env_vars(root); + loaded_config_files.push_back(path); return root; } - void include_config_file(const std::string& include_file_path) + void include_config_file(const std::string& include_file_path, std::vector& loaded_config_files) { - auto loaded_nodes = load_from_file_int(include_file_path); + auto loaded_nodes = load_from_file_int(include_file_path, loaded_config_files); for(auto n : loaded_nodes) { /*