diff --git a/src/k2/CMakeLists.txt b/src/k2/CMakeLists.txt index 8b4f1f9f..30693b67 100644 --- a/src/k2/CMakeLists.txt +++ b/src/k2/CMakeLists.txt @@ -11,4 +11,5 @@ add_subdirectory (infrastructure) add_subdirectory (module) add_subdirectory (persistence) add_subdirectory (transport) +add_subdirectory (configurator) add_subdirectory (tso) diff --git a/src/k2/appbase/Appbase.h b/src/k2/appbase/Appbase.h index b8135153..0d28e11d 100644 --- a/src/k2/appbase/Appbase.h +++ b/src/k2/appbase/Appbase.h @@ -37,6 +37,7 @@ Copyright(c) 2020 Futurewei Cloud // k2 transport #include #include +#include #include #include #include @@ -92,6 +93,7 @@ class App { } // add the discovery applet o all apps addApplet(); + addApplet(); } // helper class for positional option adding diff --git a/src/k2/appbase/CMakeLists.txt b/src/k2/appbase/CMakeLists.txt index 443f1a0d..600f28a1 100644 --- a/src/k2/appbase/CMakeLists.txt +++ b/src/k2/appbase/CMakeLists.txt @@ -8,7 +8,7 @@ set_target_properties(appbase PROPERTIES SOVERSION 1 ) -target_link_libraries (appbase PRIVATE config common transport Seastar::seastar ) +target_link_libraries (appbase PRIVATE config common transport configurator Seastar::seastar ) # export the library in the common k2Targets install(TARGETS appbase EXPORT k2Targets DESTINATION lib/k2) diff --git a/src/k2/cmd/controlPlaneOracle/CMakeLists.txt b/src/k2/cmd/controlPlaneOracle/CMakeLists.txt index 29d2d528..4a4d451f 100644 --- a/src/k2/cmd/controlPlaneOracle/CMakeLists.txt +++ b/src/k2/cmd/controlPlaneOracle/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (cpo_main cpo_main.cpp) -target_link_libraries (cpo_main PRIVATE appbase common transport Seastar::seastar cpo_service infrastructure dto) +target_link_libraries (cpo_main PRIVATE appbase common configurator transport Seastar::seastar cpo_service infrastructure dto) install (TARGETS cpo_main DESTINATION bin) diff --git a/src/k2/cmd/demo/CMakeLists.txt b/src/k2/cmd/demo/CMakeLists.txt index 823f6e87..dfe2fbd3 100644 --- a/src/k2/cmd/demo/CMakeLists.txt +++ b/src/k2/cmd/demo/CMakeLists.txt @@ -3,9 +3,9 @@ add_executable (k2_demo_rpc_echo rpc_echo.cpp) add_executable (k2_demo_rpc_service rpc_service.cpp) add_executable (k2_demo_tso tso_sample_app.cpp) -target_link_libraries (k2_demo_service PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (k2_demo_rpc_echo PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (k2_demo_rpc_service PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (k2_demo_tso PRIVATE tso_service tso_client appbase transport common Seastar::seastar) +target_link_libraries (k2_demo_service PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (k2_demo_rpc_echo PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (k2_demo_rpc_service PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (k2_demo_tso PRIVATE tso_service tso_client appbase configurator transport common Seastar::seastar) #install (TARGETS k2_demo_service k2_demo_rpc_echo k2_demo_rpc_service k2_demo_tso DESTINATION bin) diff --git a/src/k2/cmd/httpproxy/CMakeLists.txt b/src/k2/cmd/httpproxy/CMakeLists.txt index d50d6e2f..af19f599 100644 --- a/src/k2/cmd/httpproxy/CMakeLists.txt +++ b/src/k2/cmd/httpproxy/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (http_proxy http_proxy_main.cpp) -target_link_libraries (http_proxy PRIVATE appbase k23si_client cpo_client tso_client httpproxy infrastructure dto transport Seastar::seastar) +target_link_libraries (http_proxy PRIVATE appbase k23si_client cpo_client tso_client httpproxy infrastructure dto configurator transport Seastar::seastar) install (TARGETS http_proxy DESTINATION bin) diff --git a/src/k2/cmd/nodepool/CMakeLists.txt b/src/k2/cmd/nodepool/CMakeLists.txt index 6ba6e463..941662f3 100644 --- a/src/k2/cmd/nodepool/CMakeLists.txt +++ b/src/k2/cmd/nodepool/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (nodepool nodepool_main.cpp) -target_link_libraries (nodepool PRIVATE appbase k23si cpo_client common transport Seastar::seastar assignment_manager tso_client infrastructure dto) +target_link_libraries (nodepool PRIVATE appbase k23si cpo_client common configurator transport Seastar::seastar assignment_manager tso_client infrastructure dto) install (TARGETS nodepool DESTINATION bin) diff --git a/src/k2/cmd/persistence/CMakeLists.txt b/src/k2/cmd/persistence/CMakeLists.txt index db4df890..d33cf429 100644 --- a/src/k2/cmd/persistence/CMakeLists.txt +++ b/src/k2/cmd/persistence/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (persistence persistence_main.cpp) -target_link_libraries (persistence PRIVATE cpo_client appbase common transport Seastar::seastar persistence_service) +target_link_libraries (persistence PRIVATE cpo_client appbase common configurator transport Seastar::seastar persistence_service) install (TARGETS persistence DESTINATION bin) diff --git a/src/k2/cmd/plog/CMakeLists.txt b/src/k2/cmd/plog/CMakeLists.txt index a3442f89..61a74a94 100644 --- a/src/k2/cmd/plog/CMakeLists.txt +++ b/src/k2/cmd/plog/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (plog_main plog_main.cpp) -target_link_libraries (plog_main PRIVATE appbase common transport Seastar::seastar plog_service) +target_link_libraries (plog_main PRIVATE appbase common configurator transport Seastar::seastar plog_service) install (TARGETS plog_main DESTINATION bin) diff --git a/src/k2/cmd/tpcc/CMakeLists.txt b/src/k2/cmd/tpcc/CMakeLists.txt index 0bb27ad6..6ba29de7 100644 --- a/src/k2/cmd/tpcc/CMakeLists.txt +++ b/src/k2/cmd/tpcc/CMakeLists.txt @@ -3,6 +3,6 @@ file(GLOB SOURCES "*.cpp") add_executable (tpcc_client ${HEADERS} ${SOURCES}) -target_link_libraries (tpcc_client PRIVATE tso_client appbase transport common cpo_client k23si_client dto Seastar::seastar) +target_link_libraries (tpcc_client PRIVATE tso_client appbase configurator transport common cpo_client k23si_client dto Seastar::seastar) install (TARGETS tpcc_client DESTINATION bin) diff --git a/src/k2/cmd/tso/CMakeLists.txt b/src/k2/cmd/tso/CMakeLists.txt index 78bff038..f53ad919 100644 --- a/src/k2/cmd/tso/CMakeLists.txt +++ b/src/k2/cmd/tso/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable (tso tso_main.cpp) -target_link_libraries (tso PRIVATE tso_service cpo_client appbase common transport Seastar::seastar) +target_link_libraries (tso PRIVATE tso_service cpo_client appbase common configurator transport Seastar::seastar) install (TARGETS tso DESTINATION bin) diff --git a/src/k2/cmd/txbench/CMakeLists.txt b/src/k2/cmd/txbench/CMakeLists.txt index 6b634df2..7b0283bf 100644 --- a/src/k2/cmd/txbench/CMakeLists.txt +++ b/src/k2/cmd/txbench/CMakeLists.txt @@ -7,13 +7,13 @@ add_executable (rpcbench_server rpcbench_server.cpp rpcbench_common.h) add_executable (k23sibench_client k23sibench_client.cpp) -target_link_libraries (txbench_client PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (txbench_server PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (txbench_combine PRIVATE appbase transport common Seastar::seastar) +target_link_libraries (txbench_client PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (txbench_server PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (txbench_combine PRIVATE appbase configurator transport common Seastar::seastar) -target_link_libraries (rpcbench_client PRIVATE appbase transport common Seastar::seastar) -target_link_libraries (rpcbench_server PRIVATE appbase transport common Seastar::seastar) +target_link_libraries (rpcbench_client PRIVATE appbase configurator transport common Seastar::seastar) +target_link_libraries (rpcbench_server PRIVATE appbase configurator transport common Seastar::seastar) -target_link_libraries (k23sibench_client PRIVATE appbase tso_client cpo_client k23si_client dto transport Seastar::seastar) +target_link_libraries (k23sibench_client PRIVATE appbase tso_client cpo_client k23si_client dto configurator transport Seastar::seastar) #install (TARGETS txbench_client txbench_server txbench_combine rpcbench_client rpcbench_server k23sibench_client DESTINATION bin) diff --git a/src/k2/cmd/ycsb/CMakeLists.txt b/src/k2/cmd/ycsb/CMakeLists.txt index 1606ae9c..d74b8732 100644 --- a/src/k2/cmd/ycsb/CMakeLists.txt +++ b/src/k2/cmd/ycsb/CMakeLists.txt @@ -3,6 +3,6 @@ file(GLOB SOURCES "*.cpp") add_executable (ycsb_client ${HEADERS} ${SOURCES}) -target_link_libraries (ycsb_client PRIVATE tso_client appbase common cpo_client k23si_client dto transport Seastar::seastar) +target_link_libraries (ycsb_client PRIVATE tso_client appbase common cpo_client k23si_client dto configurator transport Seastar::seastar) install (TARGETS ycsb_client DESTINATION bin) diff --git a/src/k2/configurator/CMakeLists.txt b/src/k2/configurator/CMakeLists.txt new file mode 100644 index 00000000..25b14f3c --- /dev/null +++ b/src/k2/configurator/CMakeLists.txt @@ -0,0 +1,12 @@ +file(GLOB HEADERS "*.h") +file(GLOB SOURCES "*.cpp") + +add_library(configurator OBJECT ${HEADERS} ${SOURCES}) + +target_link_libraries (configurator PRIVATE common config Seastar::seastar crc32c skvhttp::common skvhttp::mpack) + +# export the library in the common k2Targets +install(TARGETS configurator EXPORT k2Targets DESTINATION lib/k2) +install(FILES ${HEADERS} DESTINATION include/k2/configurator) +# export the cmake config in the build tree for any users who want to use this project from source +export(TARGETS configurator NAMESPACE k2:: FILE configurator-config.cmake) diff --git a/src/k2/configurator/Configurator.cpp b/src/k2/configurator/Configurator.cpp new file mode 100644 index 00000000..7f74cdb1 --- /dev/null +++ b/src/k2/configurator/Configurator.cpp @@ -0,0 +1,122 @@ +/* +MIT License + +Copyright(c) 2020 Futurewei Cloud + + Permission is hereby granted, + free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : + + The above copyright notice and this permission notice shall be included in all copies + or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", + WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER + LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "Configurator.h" +#include "ConfiguratorDTO.h" + + +#include +#include +#include +#include +#include +#include +#include + +namespace k2 { + +namespace log { +inline thread_local k2::logging::Logger configurator("k2::configurator_server"); +} + +Configurator::Configurator() { + K2LOG_I(log::configurator, "ctor"); +} + +Configurator::~Configurator() { + K2LOG_I(log::configurator, "dtor"); +} + +seastar::future<> Configurator::start() { + K2LOG_I(log::configurator, "Registering message handlers"); + + RPC().registerRPCObserver(InternalVerbs::CONFGURATOR_SET, [this](SET_ConfiguratorRequest&& request) { + K2LOG_I(log::configurator, "Received set for key: {}", request.key); + auto key = request.key; + auto value = request.value; + + if (request.applyToAll) { + return ConfigDist().invoke_on_all([key, value](auto& config) { + config.emplace(key, boost::program_options::variable_value(value, "")); + boost::program_options::notify(config); + }).then([key] { + SET_ConfiguratorResponse response{.key=std::move(key)}; + return RPCResponse(Statuses::S201_Created("Configurator set accepted"), std::move(response)); + }); + } else { + auto& conf = const_cast(Config()); + conf.emplace(key, boost::program_options::variable_value(value, "")); + boost::program_options::notify(conf); + SET_ConfiguratorResponse response{.key=std::move(request.key)}; + return RPCResponse(Statuses::S201_Created("Configurator set accepted"), std::move(response)); + } + }); + + RPC().registerRPCObserver(InternalVerbs::CONFGURATOR_GET, [this](GET_ConfiguratorRequest&& request) { + K2LOG_I(log::configurator, "Received get for key: {}", request.key); + auto key = request.key; + + GET_ConfiguratorResponse response; + response.key=request.key; + auto iter = Config().find(key); + if (iter != Config().end()) { + response.value = (iter->second).as(); + } else { + return RPCResponse(Statuses::S404_Not_Found("key not found"), std::move(response)); + } + return RPCResponse(Statuses::S200_OK("get accepted"), std::move(response)); + }); + + RPC().registerRPCObserver(InternalVerbs::CONFGURATOR_DELETE, [this](DELETE_ConfiguratorRequest&& request) { + K2LOG_I(log::configurator, "Received delete for key: {}", request.key); + auto& key = request.key; + + if (request.applyToAll) { + return ConfigDist().invoke_on_all([key](auto& config) { + if (config.count(key)) { + config.erase(key); + } + }).then([key] { + DELETE_ConfiguratorResponse response{.key=std::move(key)}; + return RPCResponse(Statuses::S201_Created("Configurator set accepted"), std::move(response)); + }); + } else { + auto& config = const_cast(Config()); + if (config.count(key)) { + config.erase(key); + } + DELETE_ConfiguratorResponse response{.key=std::move(request.key)}; + return RPCResponse(Statuses::S201_Created("Configurator erase accepted"), std::move(response)); + } + }); + + return seastar::make_ready_future(); +} + +seastar::future<> Configurator::gracefulStop() { + K2LOG_I(log::configurator, "stop"); + return seastar::make_ready_future<>(); +} + + +} // namespace k2 diff --git a/src/k2/configurator/Configurator.h b/src/k2/configurator/Configurator.h new file mode 100644 index 00000000..a05a916e --- /dev/null +++ b/src/k2/configurator/Configurator.h @@ -0,0 +1,46 @@ +/* +MIT License + +Copyright(c) 2020 Futurewei Cloud + + Permission is hereby granted, + free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : + + The above copyright notice and this permission notice shall be included in all copies + or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", + WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER + LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once + +#include +#include + +namespace k2 { +class Configurator { +public : + Configurator(); + ~Configurator(); + + seastar::future<> gracefulStop(); + seastar::future<> start(); + + +private : + ConfigVar _key{"key"}; + ConfigVar _value{"value"}; + ConfigVar _op{"op"}; + ConfigVar _applyToAll{"applyToAll"}; +}; // class Configurator + +} // namespace k2 diff --git a/src/k2/configurator/ConfiguratorDTO.h b/src/k2/configurator/ConfiguratorDTO.h new file mode 100644 index 00000000..47405bca --- /dev/null +++ b/src/k2/configurator/ConfiguratorDTO.h @@ -0,0 +1,71 @@ +/* +MIT License + +Copyright(c) 2020 Futurewei Cloud + + Permission is hereby granted, + free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : + + The above copyright notice and this permission notice shall be included in all copies + or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", + WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER + LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once +#include +#include + +namespace k2 { + +struct DELETE_ConfiguratorRequest { + String key; + String value; + bool applyToAll; + K2_PAYLOAD_FIELDS(key, value, applyToAll); + K2_DEF_FMT(DELETE_ConfiguratorRequest, key, value, applyToAll); +}; + +struct DELETE_ConfiguratorResponse { + String key; + K2_PAYLOAD_FIELDS(key); + K2_DEF_FMT(DELETE_ConfiguratorResponse, key); +}; + +struct SET_ConfiguratorRequest { + String key; + String value; + bool applyToAll; + K2_PAYLOAD_FIELDS(key, value, applyToAll); + K2_DEF_FMT(SET_ConfiguratorRequest, key, value, applyToAll); +}; + +struct SET_ConfiguratorResponse { + String key; + K2_PAYLOAD_FIELDS(key); + K2_DEF_FMT(SET_ConfiguratorResponse, key); +}; + +struct GET_ConfiguratorRequest { + String key; + K2_PAYLOAD_FIELDS(key); + K2_DEF_FMT(GET_ConfiguratorRequest, key); +}; + +struct GET_ConfiguratorResponse { + String key; + String value; + K2_PAYLOAD_FIELDS(key, value); + K2_DEF_FMT(GET_ConfiguratorResponse, key, value); +}; + +} // ns k2 diff --git a/src/k2/transport/RPCTypes.h b/src/k2/transport/RPCTypes.h index 2e6a9cf1..48749aeb 100644 --- a/src/k2/transport/RPCTypes.h +++ b/src/k2/transport/RPCTypes.h @@ -38,7 +38,10 @@ typedef uint8_t Verb; // Verbs used by K2 internally enum InternalVerbs : k2::Verb { LIST_ENDPOINTS = 249, // used to discover the endpoints of a node - MAX_VERB = 250, // something we can use to prevent override of internal verbs. + CONFGURATOR_GET = 250, // used to configure get. + CONFGURATOR_SET = 251, // used to configure set. + CONFGURATOR_DELETE = 252, // used to configure clear messages. + MAX_VERB = 253, // something we can use to prevent override of internal verbs. NIL // used for messages where the verb doesn't matter }; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 53f32934..1886a971 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,7 @@ enable_testing() include_directories(include) add_subdirectory (cpo) +add_subdirectory (configurator) add_subdirectory (transport) add_subdirectory (k23si) add_subdirectory (plog) diff --git a/test/configurator/CMakeLists.txt b/test/configurator/CMakeLists.txt new file mode 100644 index 00000000..b9175b10 --- /dev/null +++ b/test/configurator/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB HEADERS "*.h") +file(GLOB SOURCES "*.cpp") + +add_executable (configurator_test ${HEADERS} ConfiguratorTest.cpp) + +target_link_libraries (configurator_test PRIVATE appbase dto configurator transport tso_client Seastar::seastar) diff --git a/test/configurator/ConfiguratorTest.cpp b/test/configurator/ConfiguratorTest.cpp new file mode 100644 index 00000000..6fa5ce2a --- /dev/null +++ b/test/configurator/ConfiguratorTest.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +#include "k2/configurator/ConfiguratorDTO.h" + +namespace k2 { +namespace log { +inline thread_local k2::logging::Logger configuratortest("k2::configuratortest"); +} + +class ConfiguratorTest { + public: + seastar::future<> start() { + + K2LOG_I(log::configuratortest, "Registering message handlers"); + auto ep = RPC().getServerEndpoint(TCPRPCProtocol::proto); + + _singleTimer.setCallback([ep, this] { + return seastar::make_ready_future() + .then([ep, this]() { + K2LOG_I(log::configuratortest, "endpoint: {}", ep->url); + K2LOG_I(log::configuratortest, "putting record"); + SET_ConfiguratorRequest request{.key=_key(), .value=_value(), .applyToAll=_applyToAll()}; + return RPC().callRPC(CONFGURATOR_SET, request, *ep, 1s) + .then([this](auto&& result) { + auto& [status, response] = result; + K2LOG_I(log::configuratortest, "put response : {} {}", status, response ); + K2EXPECT(log::configuratortest, response.key, _key()); + }); + }).then([ep, this] { + GET_ConfiguratorRequest request{.key=_key()}; + return RPC().callRPC(CONFGURATOR_GET, request, *ep, 1s) + .then([this](auto&& result) { + auto& [status, response] = result; + K2LOG_I(log::configuratortest, "got response : {} {}", status, response); + K2EXPECT(log::configuratortest, response.value, _value()); + }); + }).then([ep, this] { + K2LOG_I(log::configuratortest, "deleting record"); + DELETE_ConfiguratorRequest request{.key=_key(), .value=_value(), .applyToAll=_applyToAll()}; + return RPC().callRPC(CONFGURATOR_SET, request, *ep, 1s) + .then([this](auto&& result) { + auto& [status, response] = result; + K2LOG_I(log::configuratortest, "put response : {} {}", status, response ); + K2EXPECT(log::configuratortest, response.key, _key()); + }); + }).then([ep, this] { + GET_ConfiguratorRequest request{.key=_key()}; + return RPC().callRPC(CONFGURATOR_GET, request, *ep, 1s) + .then([](auto&& result) { + auto& [status, response] = result; + K2LOG_I(log::configuratortest, "got response : {} {}", status, response); + K2EXPECT(log::configuratortest, status, Statuses::S404_Not_Found); + }); + }) + .then([] { + AppBase().stop(0); + }); + }); + + _singleTimer.arm(0s); + return seastar::make_ready_future(); + } + + seastar::future<> gracefulStop() { + K2LOG_I(log::configuratortest, "stop"); + return _singleTimer.stop(); + } + + private : + SingleTimer _singleTimer; + ConfigVar _key{"key"}; + k2::ConfigVar _value{"value"}; + k2::ConfigVar _applyToAll{"applyToAll"}; + }; +} + +int main(int argc, char** argv) { + k2::App app("ConfiguratorTest"); + app.addOptions() + ("key", bpo::value(), "e.g. '--key abc"); + app.addOptions() + ("value", bpo::value(), "e.g. '--value 100"); + app.addOptions() + ("applyToAll", bpo::value()->default_value(false), "e.g. '--applyToAll true, or --applyToAll false"); + app.addApplet(); + return app.start(argc, argv); +} \ No newline at end of file diff --git a/test/cpo/CMakeLists.txt b/test/cpo/CMakeLists.txt index e1c684bc..85ee2f94 100644 --- a/test/cpo/CMakeLists.txt +++ b/test/cpo/CMakeLists.txt @@ -4,5 +4,5 @@ file(GLOB SOURCES "*.cpp") add_executable (cpo_test ${HEADERS} CPOTest.cpp Main.cpp) add_executable(cpo_client_test CPOClientTest.cpp) -target_link_libraries (cpo_test PRIVATE appbase Seastar::seastar dto tso_client transport) -target_link_libraries (cpo_client_test PRIVATE appbase Seastar::seastar dto tso_client cpo_client transport common) +target_link_libraries (cpo_test PRIVATE appbase Seastar::seastar dto tso_client configurator transport) +target_link_libraries (cpo_client_test PRIVATE appbase Seastar::seastar dto tso_client cpo_client configurator transport common) diff --git a/test/dto/CMakeLists.txt b/test/dto/CMakeLists.txt index 54bdee9a..8c1e8158 100644 --- a/test/dto/CMakeLists.txt +++ b/test/dto/CMakeLists.txt @@ -3,4 +3,4 @@ file(GLOB SOURCES "*.cpp") add_executable (partition_test ${HEADERS} PartitionTest.cpp) -target_link_libraries (partition_test PRIVATE Seastar::seastar dto transport cpo_client tso_client k23si_client appbase) +target_link_libraries (partition_test PRIVATE Seastar::seastar dto transport configurator cpo_client tso_client k23si_client appbase) diff --git a/test/integration/test_configurator.sh b/test/integration/test_configurator.sh new file mode 100755 index 00000000..b7bba001 --- /dev/null +++ b/test/integration/test_configurator.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -e +topname=$(dirname "$0") +source ${topname}/common_defs.sh +cd ${topname}/../.. + +# start nodepool +./build/src/k2/cmd/nodepool/nodepool ${COMMON_ARGS} --log_level Info k2::skv_server=Info -c${#EPS[@]} --tcp_endpoints ${EPS[@]} --k23si_persistence_endpoint ${PERSISTENCE} --prometheus_port 63001 --partition_request_timeout=30s & +nodepool_child_pid=$! + +# start persistence +./build/src/k2/cmd/persistence/persistence ${COMMON_ARGS} -c1 --tcp_endpoints ${PERSISTENCE} --prometheus_port 63002 & +persistence_child_pid=$! + +# start tso +./build/src/k2/cmd/tso/tso ${COMMON_ARGS} -c1 --tcp_endpoints ${TSO} --prometheus_port 63003 --tso.clock_poller_cpu=${TSO_POLLER_CORE} & +tso_child_pid=$! + +# start CPO +./build/src/k2/cmd/controlPlaneOracle/cpo_main ${COMMON_ARGS} -c1 --tcp_endpoints ${CPO} --data_dir ${CPODIR} --txn_heartbeat_deadline=10s --prometheus_port 63000 --assignment_timeout=1s --nodepool_endpoints ${EPS[@]} --tso_endpoints ${TSO} --tso_error_bound=100us --persistence_endpoints ${PERSISTENCE} & +cpo_child_pid=$! + + +function finish { + rv=$? + # cleanup code + rm -rf ${CPODIR} + + kill ${cpo_child_pid} + echo "Waiting for cpo child pid: ${cpo_child_pid}" + wait ${cpo_child_pid} + + kill ${nodepool_child_pid} + echo "Waiting for nodepool child pid: ${nodepool_child_pid}" + wait ${nodepool_child_pid} + + kill ${persistence_child_pid} + echo "Waiting for persistence child pid: ${persistence_child_pid}" + wait ${persistence_child_pid} + + kill ${tso_child_pid} + echo "Waiting for tso child pid: ${tso_child_pid}" + wait ${tso_child_pid} + echo ">>>> Test ${0} finished with code ${rv}" +} +trap finish EXIT + +sleep 1 + +./build/test/configurator/configurator_test ${COMMON_ARGS} --key "log_level" --value "Error" --prometheus_port 63100 +./build/test/configurator/configurator_test ${COMMON_ARGS} --key "test_var" --value "test_value" --applyToAll "true" --prometheus_port 63100 \ No newline at end of file diff --git a/test/k23si/CMakeLists.txt b/test/k23si/CMakeLists.txt index db269e93..2202dbe5 100644 --- a/test/k23si/CMakeLists.txt +++ b/test/k23si/CMakeLists.txt @@ -12,15 +12,15 @@ add_executable (skv_client_test ${HEADERS} SKVClientTest.cpp) add_executable (query_test ${HEADERS} QueryTest.cpp) add_executable (expression_test ${HEADERS} ExpressionTest.cpp) -target_link_libraries (k23si_test PRIVATE appbase Seastar::seastar tso_client k23si cpo_client infrastructure dto transport) +target_link_libraries (k23si_test PRIVATE appbase Seastar::seastar tso_client k23si cpo_client infrastructure dto configurator transport) target_link_libraries (indexer_test PRIVATE k23si tso_client cpo_client infrastructure dto transport appbase Seastar::seastar) target_link_libraries (skv_record_test PRIVATE dto transport) target_link_libraries (key_encoding_test PRIVATE dto transport) -target_link_libraries (schema_creation_test PRIVATE appbase Seastar::seastar dto transport) +target_link_libraries (schema_creation_test PRIVATE appbase Seastar::seastar dto configurator transport) target_link_libraries (skv_ser_test PRIVATE dto transport) -target_link_libraries (3si_txn_test PRIVATE appbase dto transport tso_client Seastar::seastar) -target_link_libraries (skv_client_test PRIVATE tso_client k23si_client cpo_client appbase dto transport Seastar::seastar) -target_link_libraries (query_test PRIVATE tso_client k23si_client cpo_client appbase dto transport Seastar::seastar) +target_link_libraries (3si_txn_test PRIVATE appbase dto configurator transport tso_client Seastar::seastar) +target_link_libraries (skv_client_test PRIVATE tso_client k23si_client cpo_client appbase dto configurator transport Seastar::seastar) +target_link_libraries (query_test PRIVATE tso_client k23si_client cpo_client appbase dto configurator transport Seastar::seastar) target_link_libraries (expression_test PRIVATE dto transport Seastar::seastar) add_test(NAME indexer COMMAND indexer_test) diff --git a/test/plog/CMakeLists.txt b/test/plog/CMakeLists.txt index 3ad04c9c..79821e8e 100644 --- a/test/plog/CMakeLists.txt +++ b/test/plog/CMakeLists.txt @@ -4,5 +4,5 @@ file(GLOB SOURCES "*.cpp") add_executable (plog_test ${HEADERS} PlogClientTest.cpp) add_executable (logstream_test ${HEADERS} LogStreamTest.cpp) -target_link_libraries (plog_test PRIVATE appbase cpo_client transport common plog_client Seastar::seastar dto) -target_link_libraries (logstream_test PRIVATE appbase cpo_client plog_client transport common log_stream Seastar::seastar dto) +target_link_libraries (plog_test PRIVATE appbase cpo_client transport configurator common plog_client Seastar::seastar dto) +target_link_libraries (logstream_test PRIVATE appbase cpo_client plog_client transport configurator common log_stream Seastar::seastar dto)