diff --git a/build/includes/global/global.hpp b/build/includes/global/global.hpp index 376ef7e0397f9b122b836ba59b106678f399cd7a..08104ec274048b9240e65ef977561aaeabba4516 100644 --- a/build/includes/global/global.hpp +++ b/build/includes/global/global.hpp @@ -1,20 +1,8 @@ #pragma once #include <chrono> -#include <optional> -#include <iostream> -#include <vector> -#include <bits/stdc++.h> -#include <unistd.h> -#include "json.hpp" -#include "caf/all.hpp" - -using json = nlohmann::json; - - extern bool debug; -// get_settings /** * Return the time between to time points @@ -24,33 +12,3 @@ double calculateTime(std::chrono::time_point<std::chrono::system_clock> start, -template <typename T> -std::optional<T> getSettings(std::string json_settings_file, std::string key_1, std::string key_2, - T return_value) { - json settings; - std::ifstream settings_file(json_settings_file); - settings_file >> settings; - settings_file.close(); - - // find first key - try { - if (settings.find(key_1) != settings.end()) { - json key_1_settings = settings[key_1]; - - // find value behind second key - if (key_1_settings.find(key_2) != key_1_settings.end()) { - return key_1_settings[key_2]; - } else - return {}; - - } else { - return {}; // return none in the optional (error value) - } - } catch (json::exception& e) { - std::cout << e.what() << "\n"; - std::cout << key_1 << "\n"; - std::cout << key_2 << "\n"; - return {}; - } - -} \ No newline at end of file diff --git a/build/includes/global/settings_functions.hpp b/build/includes/global/settings_functions.hpp index c0985db230b97e7073a6296285ad057306abeeb8..9989aa11acf05770391bed3277a46eeef1d10c04 100644 --- a/build/includes/global/settings_functions.hpp +++ b/build/includes/global/settings_functions.hpp @@ -1,6 +1,12 @@ #pragma once +#include <string> +#include <vector> +#include <optional> +#include "json.hpp" +#include <bits/stdc++.h> +#include <sys/stat.h> -#include "caf/all.hpp" +using json = nlohmann::json; struct Distributed_Settings; struct Summa_Actor_Settings; @@ -18,6 +24,7 @@ struct Distributed_Settings { int heartbeat_interval; // number of seconds between each heartbeat message int lost_node_threshold; // the maximum value the lost_potentail_indicator value can be before // we assume the node is lost + std::vector<std::string> backup_servers; }; template<class Inspector> @@ -84,7 +91,43 @@ bool inspect(Inspector& inspector, HRU_Actor_Settings& hru_actor_settings) { inspector.field("output_frequency", hru_actor_settings.output_frequency)); } +// Read in the settings from JSON +template <typename T> +std::optional<T> getSettings(std::string json_settings_file, std::string key_1, std::string key_2, + T return_value) { + json settings; + std::ifstream settings_file(json_settings_file); + settings_file >> settings; + settings_file.close(); + + // find first key + try { + if (settings.find(key_1) != settings.end()) { + json key_1_settings = settings[key_1]; + + // find value behind second key + if (key_1_settings.find(key_2) != key_1_settings.end()) { + return key_1_settings[key_2]; + } else + return {}; + + } else { + return {}; // return none in the optional (error value) + } + } catch (json::exception& e) { + std::cout << e.what() << "\n"; + std::cout << key_1 << "\n"; + std::cout << key_2 << "\n"; + return {}; + } + +} + +// Get settings from settings file in array format +std::optional<std::vector<std::string>> getSettingsArray(std::string json_settings_file, std::string key_1, std::string key_2); + +// Load in the settings from Json For SUMMA int read_settings_from_json(std::string json_settings_file_path, Distributed_Settings &distributed_settings, Summa_Actor_Settings &summa_actor_settings, @@ -92,6 +135,7 @@ int read_settings_from_json(std::string json_settings_file_path, Job_Actor_Settings &job_actor_settings, HRU_Actor_Settings &hru_actor_settings); +// Check the settings - Print them out to stdout void check_settings_from_json(Distributed_Settings &distributed_settings, Summa_Actor_Settings &summa_actor_settings, File_Access_Actor_Settings &file_access_actor_settings, Job_Actor_Settings &job_actor_settings, HRU_Actor_Settings &hru_actor_settings); \ No newline at end of file diff --git a/build/source/actors/global/global.cpp b/build/source/actors/global/global.cpp index c6e01f6a11a3575184033f06ee1a15f51e42f0fc..f6c1efb3747a381d2ba7d9bbe55c1c848aa78a33 100644 --- a/build/source/actors/global/global.cpp +++ b/build/source/actors/global/global.cpp @@ -1,7 +1,4 @@ #include "global.hpp" -#include <chrono> -#include "json.hpp" - double calculateTime(std::chrono::time_point<std::chrono::system_clock> start, diff --git a/build/source/actors/global/settings_functions.cpp b/build/source/actors/global/settings_functions.cpp index b0656ba5cc403767195f3a11524e4c84eefa9626..4079ef4a353eb1eebe595639aa15df93b9f3c7c0 100644 --- a/build/source/actors/global/settings_functions.cpp +++ b/build/source/actors/global/settings_functions.cpp @@ -1,5 +1,42 @@ #include "settings_functions.hpp" -#include "global.hpp" + +std::optional<std::vector<std::string>> getSettingsArray(std::string json_settings_file, + std::string key_1, std::string key_2) { + json settings; + std::ifstream settings_file(json_settings_file); + settings_file >> settings; + settings_file.close(); + std::vector<std::string> return_vector; + + // find first key + try { + if (settings.find(key_1) != settings.end()) { + json key_1_settings = settings[key_1]; + + // find value behind second key + if (key_1_settings.find(key_2) != key_1_settings.end()) { + for(auto& host : key_1_settings[key_2]) { + return_vector.push_back(host["hostname"]); + } + return return_vector; + } else + return {}; + + } else { + return {}; // return none in the optional (error value) + } + } catch (json::exception& e) { + std::cout << e.what() << "\n"; + std::cout << key_1 << "\n"; + std::cout << key_2 << "\n"; + return {}; + } + +} + + + + int read_settings_from_json(std::string json_settings_file, Distributed_Settings &distributed_settings, @@ -8,6 +45,12 @@ int read_settings_from_json(std::string json_settings_file, Job_Actor_Settings &job_actor_settings, HRU_Actor_Settings &hru_actor_settings) { + // Check if File Exists + struct stat buffer; + if (stat(json_settings_file.c_str(), &buffer) != 0) { + std::cout << "JSON Configuration File Could Not Be Found\n"; + return -1; + } // read distributed settings std::string parent_key = "Distributed_Settings"; @@ -32,6 +75,8 @@ int read_settings_from_json(std::string json_settings_file, distributed_settings.lost_node_threshold = getSettings(json_settings_file, parent_key, "lost_node_threshold", distributed_settings.lost_node_threshold).value_or(-1); + distributed_settings.backup_servers = getSettingsArray(json_settings_file, parent_key, + "backup_servers").value_or(std::vector<std::string>()); // read settings for summa actor parent_key = "Summa_Actor"; diff --git a/build/source/testing/settings_functions/config_files/Summa_Actors_Settings.json b/build/source/testing/settings_functions/config_files/Summa_Actors_Settings.json new file mode 100644 index 0000000000000000000000000000000000000000..4785c449aebf4c7cd3783498a7839328e6065494 --- /dev/null +++ b/build/source/testing/settings_functions/config_files/Summa_Actors_Settings.json @@ -0,0 +1,38 @@ +{ + "Distributed_Settings": { + "distributed_mode": true, + "hostname": "7c75a36f6f33", + "port": 4444, + "total_hru_count": 12, + "num_hru_per_batch": 2, + "heartbeat_interval": 10, + "lost_node_threshold": 3, + "backup_servers": [{ + "hostname": "7c75a36" + }, + { + "hostname": "7ca36" + }] + }, + + "Summa_Actor": { + "max_gru_per_job": 100 + }, + + "File_Access_Actor": { + "num_vectors_in_output_manager": 1 + }, + + "Job_Actor": { + "file_manager_path": "/Summa-Actors-Settings-Output-Test-Fix/summa-output-fix/fileManager.txt", + "output_structure_size": 1, + "output_csv": false, + "csv_path": "/Summa-Actors/Laugh-Tests/test_cases/output/actors/celia1990/" + + }, + + "HRU_Actor": { + "print_output": true, + "output_frequency": 100 + } +} \ No newline at end of file diff --git a/build/source/testing/settings_functions/main.cpp b/build/source/testing/settings_functions/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb88bea458c9f5d5586bcd85cbd94ef2fcb385fb --- /dev/null +++ b/build/source/testing/settings_functions/main.cpp @@ -0,0 +1,6 @@ +#include "test.hpp" + + +int main() { + testDistributedSettings(); +} \ No newline at end of file diff --git a/build/source/testing/settings_functions/makefile b/build/source/testing/settings_functions/makefile new file mode 100644 index 0000000000000000000000000000000000000000..76c1e6f510a984fd1d8c33dee7add1dd21ff5d00 --- /dev/null +++ b/build/source/testing/settings_functions/makefile @@ -0,0 +1,23 @@ +CC = g++ # C++ + +INCLUDES=-I/usr/local/include +LIBRARIES=-L/usr/local/lib +FLAGS = -g -O0 -Wfatal-errors -std=c++17 + +SOURCE_DIR = /Summa-Actors/build/source/actors +INCLUDE_DIR = /Summa-Actors/build/includes +SETTINGS_FILES = $(SOURCE_DIR)/global/settings_functions.cpp +GLOBAL_INCLUDES = -I$(INCLUDE_DIR)/global + + + +all: compile link clean + +compile: + $(CC) $(FLAGS) -c main.cpp test.cpp $(SETTINGS_FILES) $(GLOBAL_INCLUDES) $(INCLUDES) + +link: + $(CC) $(FLAGS) -o main *.o $(LIBRARIES) + +clean: + rm *.o diff --git a/build/source/testing/settings_functions/test.cpp b/build/source/testing/settings_functions/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..aac5a2c55d7e69606462136f07884ba6d91778a1 --- /dev/null +++ b/build/source/testing/settings_functions/test.cpp @@ -0,0 +1,60 @@ +#include "test.hpp" + + +#define IS_TRUE(x) { if (!(x)) std::cout << __FUNCTION__ << " failed on line " << __LINE__ << std::endl; } + + + +void testDistributedSettings() { + std::cout << "Testing Distributed Settings\n"; + std::string failing_config_file = "somewhere/that/doesn't/exist.json\n"; + std::string config_file_1 = "config_files/Summa_Actors_Settings.json"; + int err; + // Define Structures to hold settings + Distributed_Settings distributed_settings; + Summa_Actor_Settings summa_actor_settings; + File_Access_Actor_Settings file_access_actor_settings; + Job_Actor_Settings job_actor_settings; + HRU_Actor_Settings hru_actor_settings; + + // Test with file that should fail + err = read_settings_from_json(failing_config_file, + distributed_settings, + summa_actor_settings, + file_access_actor_settings, + job_actor_settings, + hru_actor_settings); + IS_TRUE(err == -1); + + // Test with real settings file + err = read_settings_from_json(config_file_1, + distributed_settings, + summa_actor_settings, + file_access_actor_settings, + job_actor_settings, + hru_actor_settings); + + IS_TRUE(distributed_settings.distributed_mode); + IS_TRUE(distributed_settings.hostname == "7c75a36f6f33"); + IS_TRUE(distributed_settings.port == 4444); + IS_TRUE(distributed_settings.total_hru_count == 12); + IS_TRUE(distributed_settings.num_hru_per_batch == 2); + IS_TRUE(distributed_settings.heartbeat_interval == 10); + IS_TRUE(distributed_settings.lost_node_threshold == 3); + std::vector<std::string> verification_vector = {"7c75a36", "7ca36"}; + IS_TRUE(distributed_settings.backup_servers == verification_vector); + + IS_TRUE(summa_actor_settings.max_gru_per_job == 100); + + IS_TRUE(file_access_actor_settings.num_vectors_in_output_manager == 1); + + IS_TRUE(job_actor_settings.file_manager_path == "/Summa-Actors-Settings-Output-Test-Fix/summa-output-fix/fileManager.txt") + IS_TRUE(job_actor_settings.output_structure_size == 1) + IS_TRUE(!job_actor_settings.output_csv) + IS_TRUE(job_actor_settings.csv_path == "/Summa-Actors/Laugh-Tests/test_cases/output/actors/celia1990/") + + IS_TRUE(hru_actor_settings.print_output) + IS_TRUE(hru_actor_settings.output_frequency == 100) + + +} \ No newline at end of file diff --git a/build/source/testing/settings_functions/test.hpp b/build/source/testing/settings_functions/test.hpp new file mode 100644 index 0000000000000000000000000000000000000000..dac7e5f0f7c95b383ae408f81b40cfbe861fb08e --- /dev/null +++ b/build/source/testing/settings_functions/test.hpp @@ -0,0 +1,7 @@ +#include <iostream> +#include "settings_functions.hpp" + + + +// Testing function for setting specific to SUMMA-Distributed +void testDistributedSettings(); \ No newline at end of file diff --git a/build/source/testing/summa_actor/makefile b/build/source/testing/summa_actor/makefile index 1730dd9254048dbc207f8bfd04a5029f670d6939..043ffb1c4c527af215d02875890a49a2beb0b085 100644 --- a/build/source/testing/summa_actor/makefile +++ b/build/source/testing/summa_actor/makefile @@ -20,11 +20,11 @@ CLIENT_MANAGER = $(SOURCE_DIR)/summa_actor/client.cpp all: compile link clean compile: - g++ $(FLAGS) -c main.cpp test.cpp $(BATCH_MANGER) $(CLIENT_MANAGER) $(SETTINGS_FILES) \ + $(CC) $(FLAGS) -c main.cpp test.cpp $(BATCH_MANGER) $(CLIENT_MANAGER) $(SETTINGS_FILES) \ $(SUMMA_SERVER) $(SUMMA_SERVER_BACKUP) $(SUMMA_ACTOR_INCLUDES) $(GLOBAL_INCLUDES) $(INCLUDES) link: - g++ $(FLAGS) -Wl,-rpath='/usr/local/lib' -o main *.o $(LIBRARIES) + $(CC) $(FLAGS) -Wl,-rpath='/usr/local/lib' -o main *.o $(LIBRARIES) clean: rm *.o \ No newline at end of file