diff --git a/examples/demo_verification/lifecycle_demo_test.json b/examples/demo_verification/lifecycle_demo_test.json index 0ad84cdb4..a43253be4 100644 --- a/examples/demo_verification/lifecycle_demo_test.json +++ b/examples/demo_verification/lifecycle_demo_test.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/examples", diff --git a/score/launch_manager/src/daemon/src/configuration/config_schema/examples/example_conf.json b/score/launch_manager/src/daemon/src/configuration/config_schema/examples/example_conf.json index ddb3bc7a9..92a216d86 100755 --- a/score/launch_manager/src/daemon/src/configuration/config_schema/examples/example_conf.json +++ b/score/launch_manager/src/daemon/src/configuration/config_schema/examples/example_conf.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "ready_timeout": 0.5, diff --git a/score/launch_manager/src/daemon/src/configuration/config_schema/launch_manager.schema.json b/score/launch_manager/src/daemon/src/configuration/config_schema/launch_manager.schema.json index 371630d73..b3481bbdf 100644 --- a/score/launch_manager/src/daemon/src/configuration/config_schema/launch_manager.schema.json +++ b/score/launch_manager/src/daemon/src/configuration/config_schema/launch_manager.schema.json @@ -373,7 +373,7 @@ "type": "integer", "description": "Specifies the schema version number that the Launch Manager uses to determine how to parse and validate this configuration file.", "enum": [ - 1 + 2 ] }, "defaults": { diff --git a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_config_loader_UT.cpp b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_config_loader_UT.cpp index f5877b710..89e9f967e 100644 --- a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_config_loader_UT.cpp +++ b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_config_loader_UT.cpp @@ -10,8 +10,8 @@ * * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -#include "score/mw/launch_manager/configuration/flatbuffer_config_loader.hpp" #include "score/launch_manager/src/daemon/src/configuration/details/new_lm_flatcfg_generated.h" +#include "score/mw/launch_manager/configuration/flatbuffer_config_loader.hpp" #include "score/filesystem/path.h" #include "score/os/errno.h" @@ -38,8 +38,9 @@ using ::testing::StrEq; const score::filesystem::Path kTestPath{"/tmp/test_config.bin"}; -std::vector finishBuffer(::flatbuffers::FlatBufferBuilder& fbb, - ::flatbuffers::Offset root) +std::vector finishBuffer( + ::flatbuffers::FlatBufferBuilder& fbb, + ::flatbuffers::Offset root) { fb::FinishLaunchManagerConfigBuffer(fbb, root); const auto* buf = fbb.GetBufferPointer(); @@ -52,13 +53,14 @@ std::vector finishBuffer(::flatbuffers::FlatBufferBuilder& fbb, ::flatbuffers::Offset buildDefaultSandbox(::flatbuffers::FlatBufferBuilder& fbb) { - return fb::CreateSandbox(fbb, - 0 /*uid*/, - 0 /*gid*/, - 0 /*supplementary_group_ids*/, - 0 /*security_policy*/, - fb::SchedulingPolicy::OTHER, - 0 /*scheduling_priority*/); + return fb::CreateSandbox( + fbb, + 0 /*uid*/, + 0 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); } ::flatbuffers::Offset buildDefaultComponentProperties(::flatbuffers::FlatBufferBuilder& fbb) @@ -76,8 +78,15 @@ ::flatbuffers::Offset buildDefaultDeploymentConfig(::flatb auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); return fb::CreateDeploymentConfig( - fbb, 1.0 /*ready_timeout*/, 1.0 /*shutdown_timeout*/, 0 /*environmental_variables*/, - bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + fbb, + 1000 /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); } ::flatbuffers::Offset buildDefaultComponent( @@ -102,11 +111,13 @@ std::vector buildConfigWithComponents( ::flatbuffers::FlatBufferBuilder& fbb, ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> comps) { - auto fallback = fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0 /*evaluation_cycle*/); + auto fallback = + fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000 /*evaluation_cycle_ms*/); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto irt = fbb.CreateString("Startup"); - auto config = fb::CreateLaunchManagerConfig(fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); + auto config = fb::CreateLaunchManagerConfig( + fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); return finishBuffer(fbb, config); } @@ -114,11 +125,13 @@ std::vector buildConfigWithRunTargets( ::flatbuffers::FlatBufferBuilder& fbb, ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> rts) { - auto fallback = fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0 /*evaluation_cycle*/); + auto fallback = + fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000 /*evaluation_cycle_ms*/); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto irt = fbb.CreateString("Startup"); - auto config = fb::CreateLaunchManagerConfig(fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); + auto config = fb::CreateLaunchManagerConfig( + fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); return finishBuffer(fbb, config); } @@ -145,17 +158,18 @@ class FlatbufferConfigLoaderTest : public ::testing::Test MockBufferLoader::result_ = std::vector{}; } - std::vector buildMinimalConfig(int32_t schema_version = FlatbufferConfigLoader::kExpectedSchemaVersion, const char* initial_run_target = "Startup") + std::vector buildMinimalConfig( + int32_t schema_version = FlatbufferConfigLoader::kExpectedSchemaVersion, + const char* initial_run_target = "Startup") { ::flatbuffers::FlatBufferBuilder fbb; auto irt = fbb.CreateString(initial_run_target); auto fallback = - fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0 /*evaluation_cycle*/); + fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000 /*evaluation_cycle_ms*/); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); - auto config = - fb::CreateLaunchManagerConfig(fbb, schema_version, comps, rts, irt, fallback, alive_sup); + auto config = fb::CreateLaunchManagerConfig(fbb, schema_version, comps, rts, irt, fallback, alive_sup); return finishBuffer(fbb, config); } @@ -192,7 +206,7 @@ TEST_F(FlatbufferConfigLoaderTest, LoadSingleComponent) ::flatbuffers::FlatBufferBuilder fbb; auto alive_sup = fb::CreateComponentAliveSupervision( - fbb, 0.5 /*reporting_cycle*/, 2 /*failed_cycles_tolerance*/, 1 /*min_indications*/, 3 /*max_indications*/); + fbb, 500 /*reporting_cycle_ms*/, 2 /*failed_cycles_tolerance*/, 1 /*min_indications*/, 3 /*max_indications*/); auto app_profile = fb::CreateApplicationProfile( fbb, fb::ApplicationType::Reporting_And_Supervised, true /*is_self_terminating*/, alive_sup); auto bin_name = fbb.CreateString("my_binary"); @@ -207,8 +221,15 @@ TEST_F(FlatbufferConfigLoaderTest, LoadSingleComponent) auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); auto deploy = fb::CreateDeploymentConfig( - fbb, 1.5 /*ready_timeout*/, 2.5 /*shutdown_timeout*/, 0 /*environmental_variables*/, - bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + fbb, + 1500 /*ready_timeout_ms*/, + 2500 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp_name = fbb.CreateString("TestComponent"); auto comp_desc = fbb.CreateString("A test component"); @@ -224,8 +245,8 @@ TEST_F(FlatbufferConfigLoaderTest, LoadSingleComponent) EXPECT_THAT(comp.name, Eq("TestComponent")); EXPECT_THAT(comp.description, Eq("A test component")); EXPECT_THAT(comp.component_properties.binary_name, Eq("my_binary")); - EXPECT_THAT(comp.component_properties.application_profile.application_type, - Eq(ApplicationType::ReportingAndSupervised)); + EXPECT_THAT( + comp.component_properties.application_profile.application_type, Eq(ApplicationType::ReportingAndSupervised)); EXPECT_THAT(comp.component_properties.application_profile.is_self_terminating, IsTrue()); ASSERT_THAT(comp.component_properties.application_profile.alive_supervision.has_value(), IsTrue()); EXPECT_THAT(comp.component_properties.application_profile.alive_supervision->reporting_cycle_ms, Eq(500U)); @@ -258,7 +279,7 @@ TEST_F(FlatbufferConfigLoaderTest, LoadRunTargets) auto rt_desc = fbb.CreateString("Initial state"); auto rt_dep = fbb.CreateString("component_a"); auto rt_deps = fbb.CreateVector(std::vector<::flatbuffers::Offset<::flatbuffers::String>>{rt_dep}); - auto rt = fb::CreateRunTarget(fbb, rt_name, rt_desc, rt_deps, 5.0 /*transition_timeout*/, switch_action); + auto rt = fb::CreateRunTarget(fbb, rt_name, rt_desc, rt_deps, 5000 /*transition_timeout_ms*/, switch_action); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{rt}); auto result = loadBuffer(buildConfigWithRunTargets(fbb, rts)); @@ -284,13 +305,14 @@ TEST_F(FlatbufferConfigLoaderTest, LoadFallbackRunTarget) auto fb_desc = fbb.CreateString("Fallback state"); auto fb_dep = fbb.CreateString("critical_comp"); auto fb_deps = fbb.CreateVector(std::vector<::flatbuffers::Offset<::flatbuffers::String>>{fb_dep}); - auto fallback = fb::CreateFallbackRunTarget(fbb, fb_desc, fb_deps, 10.0 /*transition_timeout*/); + auto fallback = fb::CreateFallbackRunTarget(fbb, fb_desc, fb_deps, 10000 /*transition_timeout_ms*/); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0 /*evaluation_cycle*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000 /*evaluation_cycle_ms*/); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto irt = fbb.CreateString("Startup"); - auto config = fb::CreateLaunchManagerConfig(fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); + auto config = fb::CreateLaunchManagerConfig( + fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); auto result = loadBuffer(finishBuffer(fbb, config)); @@ -308,12 +330,14 @@ TEST_F(FlatbufferConfigLoaderTest, LoadAliveSupervision) ::flatbuffers::FlatBufferBuilder fbb; - auto alive_sup = fb::CreateAliveSupervision(fbb, 0.25 /*evaluation_cycle*/); - auto fallback = fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 250 /*evaluation_cycle_ms*/); + auto fallback = + fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto irt = fbb.CreateString("Startup"); - auto config = fb::CreateLaunchManagerConfig(fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); + auto config = fb::CreateLaunchManagerConfig( + fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup); auto result = loadBuffer(finishBuffer(fbb, config)); @@ -329,14 +353,16 @@ TEST_F(FlatbufferConfigLoaderTest, LoadWatchdog) auto dev_path = fbb.CreateString("/dev/watchdog0"); auto watchdog = fb::CreateWatchdog( - fbb, dev_path, 30.0 /*max_timeout*/, true /*deactivate_on_shutdown*/, false /*require_magic_close*/); + fbb, dev_path, 30000 /*max_timeout_ms*/, true /*deactivate_on_shutdown*/, false /*require_magic_close*/); - auto fallback = fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0 /*evaluation_cycle*/); + auto fallback = + fb::CreateFallbackRunTarget(fbb, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000 /*evaluation_cycle_ms*/); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto irt = fbb.CreateString("Startup"); - auto config = fb::CreateLaunchManagerConfig(fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup, watchdog); + auto config = fb::CreateLaunchManagerConfig( + fbb, FlatbufferConfigLoader::kExpectedSchemaVersion, comps, rts, irt, fallback, alive_sup, watchdog); auto result = loadBuffer(finishBuffer(fbb, config)); @@ -356,19 +382,20 @@ TEST_F(FlatbufferConfigLoaderTest, LoadRestartRecoveryAction) ::flatbuffers::FlatBufferBuilder fbb; - auto restart = fb::CreateRestartAction(fbb, 3 /*number_of_attempts*/, 1.5 /*delay_before_restart*/); + auto restart = fb::CreateRestartAction(fbb, 3 /*number_of_attempts*/, 1500 /*delay_before_restart_ms*/); auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, - 1.0 /*ready_timeout*/, - 1.0 /*shutdown_timeout*/, - 0 /*environmental_variables*/, - bin_dir, - work_dir, - restart, - 0 /*recovery_action*/, - sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 1000 /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + restart, + 0 /*recovery_action*/, + sandbox); auto comp = buildDefaultComponent(fbb, "restart_comp", buildDefaultComponentProperties(fbb), deploy); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{comp}); @@ -394,7 +421,7 @@ TEST_F(FlatbufferConfigLoaderTest, LoadSwitchRunTargetAction) auto switch_action = fb::CreateSwitchRunTargetAction(fbb, target_name); auto rt_name = fbb.CreateString("Startup"); auto rt = fb::CreateRunTarget( - fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/, switch_action); + fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/, switch_action); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{rt}); auto result = loadBuffer(buildConfigWithRunTargets(fbb, rts)); @@ -411,27 +438,29 @@ TEST_F(FlatbufferConfigLoaderTest, LoadSandbox) auto sec_policy = fbb.CreateString("strict"); auto supp_gids = fbb.CreateVector(std::vector{100, 200}); - auto sandbox = fb::CreateSandbox(fbb, - 1000 /*uid*/, - 1000 /*gid*/, - supp_gids, - sec_policy, - fb::SchedulingPolicy::FIFO, - 50 /*scheduling_priority*/, - 4096 /*max_memory_usage*/, - 80 /*max_cpu_usage*/); + auto sandbox = fb::CreateSandbox( + fbb, + 1000 /*uid*/, + 1000 /*gid*/, + supp_gids, + sec_policy, + fb::SchedulingPolicy::FIFO, + 50 /*scheduling_priority*/, + 4096 /*max_memory_usage*/, + 80 /*max_cpu_usage*/); auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); - auto deploy = fb::CreateDeploymentConfig(fbb, - 0.5 /*ready_timeout*/, - 0.5 /*shutdown_timeout*/, - 0 /*environmental_variables*/, - bin_dir, - work_dir, - 0 /*ready_recovery_action*/, - 0 /*recovery_action*/, - sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 500 /*ready_timeout_ms*/, + 500 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp = buildDefaultComponent(fbb, "sandboxed_comp", buildDefaultComponentProperties(fbb), deploy); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{comp}); @@ -462,7 +491,7 @@ TEST_F(FlatbufferConfigLoaderTest, LoadComponentAliveSupervision) ::flatbuffers::FlatBufferBuilder fbb; auto comp_alive_sup = fb::CreateComponentAliveSupervision( - fbb, 1.0 /*reporting_cycle*/, 3 /*failed_cycles_tolerance*/, 2 /*min_indications*/, 5 /*max_indications*/); + fbb, 1000 /*reporting_cycle_ms*/, 3 /*failed_cycles_tolerance*/, 2 /*min_indications*/, 5 /*max_indications*/); auto app_profile = fb::CreateApplicationProfile( fbb, fb::ApplicationType::Reporting_And_Supervised, false /*is_self_terminating*/, comp_alive_sup); auto bin_name = fbb.CreateString("supervised_bin"); @@ -504,8 +533,15 @@ TEST_F(FlatbufferConfigLoaderTest, LoadEnvironmentalVariables) auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); auto deploy = fb::CreateDeploymentConfig( - fbb, 0.5 /*ready_timeout*/, 0.5 /*shutdown_timeout*/, env_vars, - bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + fbb, + 500 /*ready_timeout_ms*/, + 500 /*shutdown_timeout_ms*/, + env_vars, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp = buildDefaultComponent(fbb, "env_comp", buildDefaultComponentProperties(fbb), deploy); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{comp}); @@ -650,8 +686,8 @@ TEST_F(FlatbufferConfigLoaderTest, MissingSchemaVersionReturnsInvalidFormat) ::flatbuffers::FlatBufferBuilder fbb; auto irt = fbb.CreateString("Startup"); - auto fallback = fb::CreateFallbackRunTarget(fbb, 0, 0, 1.0); - auto alive_sup = fb::CreateAliveSupervision(fbb, 1.0); + auto fallback = fb::CreateFallbackRunTarget(fbb, 0, 0, 1000); + auto alive_sup = fb::CreateAliveSupervision(fbb, 1000); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{}); auto config = fb::CreateLaunchManagerConfig(fbb, std::nullopt, comps, rts, irt, fallback, alive_sup); diff --git a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.cpp b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.cpp index aa4ed0eec..4827a6348 100644 --- a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.cpp +++ b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -34,8 +33,9 @@ namespace { template -score::cpp::expected requireScalarValue(const ::flatbuffers::Optional& field, - const std::string_view field_name) +score::cpp::expected requireScalarValue( + const ::flatbuffers::Optional& field, + const std::string_view field_name) { if (!field.has_value()) { @@ -56,29 +56,6 @@ std::optional optionalScalarValue(const ::flatbuffers::Optional& field) namespace details { -constexpr double kSecondsToMilliseconds = 1000.0; - -score::cpp::expected secondsToMs(double seconds) -{ - if (seconds < 0.0) - { - LM_LOG_ERROR() << "Negative time value " << seconds << " seconds is not supported"; - return score::cpp::make_unexpected(IConfigLoader::Error::InvalidFormat); - } - if (seconds * kSecondsToMilliseconds > static_cast(std::numeric_limits::max())) - { - LM_LOG_ERROR() << "Time value " << seconds << " seconds exceeds maximum representable milliseconds"; - return score::cpp::make_unexpected(IConfigLoader::Error::InvalidFormat); - } - const auto result = static_cast(seconds * kSecondsToMilliseconds); - if (seconds > 0.0 && result == 0U) - { - LM_LOG_ERROR() << "Sub-millisecond time value " << seconds << " seconds rounds to 0ms"; - return score::cpp::make_unexpected(IConfigLoader::Error::InvalidFormat); - } - return result; -} - ApplicationType convertApplicationType(fb::ApplicationType fb_type) { switch (fb_type) @@ -202,13 +179,7 @@ score::cpp::expected, IConfigLoader::Error> convert { return score::cpp::make_unexpected(delay_before_restart.error()); } - auto delay_ms = secondsToMs(*delay_before_restart); - if (!delay_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for RestartAction::delay_before_restart"; - return score::cpp::make_unexpected(delay_ms.error()); - } - return std::optional{RestartAction{*number_of_attempts, *delay_ms}}; + return std::optional{RestartAction{*number_of_attempts, *delay_before_restart}}; } std::optional convertSwitchRunTargetAction(const fb::SwitchRunTargetAction* sa) @@ -247,13 +218,7 @@ score::cpp::expected convertCom { return score::cpp::make_unexpected(failed_cycles_tolerance.error()); } - auto reporting_cycle_ms = secondsToMs(*reporting_cycle); - if (!reporting_cycle_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for ComponentAliveSupervision::reporting_cycle"; - return score::cpp::make_unexpected(reporting_cycle_ms.error()); - } - result.reporting_cycle_ms = *reporting_cycle_ms; + result.reporting_cycle_ms = *reporting_cycle; result.failed_cycles_tolerance = *failed_cycles_tolerance; result.min_indications = optionalScalarValue(fb_cas->min_indications()); result.max_indications = optionalScalarValue(fb_cas->max_indications()); @@ -428,20 +393,8 @@ score::cpp::expected convertDeploymentCo { return score::cpp::make_unexpected(shutdown_timeout.error()); } - auto ready_timeout_ms = secondsToMs(*ready_timeout); - if (!ready_timeout_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for DeploymentConfig::ready_timeout"; - return score::cpp::make_unexpected(ready_timeout_ms.error()); - } - auto shutdown_timeout_ms = secondsToMs(*shutdown_timeout); - if (!shutdown_timeout_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for DeploymentConfig::shutdown_timeout"; - return score::cpp::make_unexpected(shutdown_timeout_ms.error()); - } - result.ready_timeout_ms = *ready_timeout_ms; - result.shutdown_timeout_ms = *shutdown_timeout_ms; + result.ready_timeout_ms = *ready_timeout; + result.shutdown_timeout_ms = *shutdown_timeout; result.environmental_variables = convertEnvironmentalVariables(fb_dc->environmental_variables()); result.bin_dir = fb_dc->bin_dir()->str(); result.working_dir = fb_dc->working_dir()->str(); @@ -513,13 +466,7 @@ score::cpp::expected convertRunTarget(con result.name = fb_rt->name()->str(); result.description = safeString(fb_rt->description()); result.depends_on = convertStringVector(fb_rt->depends_on()); - auto transition_timeout_ms = secondsToMs(*transition_timeout); - if (!transition_timeout_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for RunTarget::transition_timeout"; - return score::cpp::make_unexpected(transition_timeout_ms.error()); - } - result.transition_timeout_ms = *transition_timeout_ms; + result.transition_timeout_ms = *transition_timeout; result.recovery_action = convertRequiredSwitchRunTargetAction(fb_rt->recovery_action()); } return result; @@ -539,13 +486,7 @@ score::cpp::expected convertFallb } result.description = safeString(fb_frt->description()); result.depends_on = convertStringVector(fb_frt->depends_on()); - auto transition_timeout_ms = secondsToMs(*transition_timeout); - if (!transition_timeout_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for FallbackRunTarget::transition_timeout"; - return score::cpp::make_unexpected(transition_timeout_ms.error()); - } - result.transition_timeout_ms = *transition_timeout_ms; + result.transition_timeout_ms = *transition_timeout; } return result; } @@ -562,13 +503,7 @@ score::cpp::expected convertAliveS { return score::cpp::make_unexpected(evaluation_cycle.error()); } - auto evaluation_cycle_ms = secondsToMs(*evaluation_cycle); - if (!evaluation_cycle_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for AliveSupervision::evaluation_cycle"; - return score::cpp::make_unexpected(evaluation_cycle_ms.error()); - } - return AliveSupervisionConfig{*evaluation_cycle_ms}; + return AliveSupervisionConfig{*evaluation_cycle}; } score::cpp::expected, IConfigLoader::Error> convertWatchdog(const fb::Watchdog* fb_wd) @@ -597,13 +532,7 @@ score::cpp::expected, IConfigLoader::Error> conver } WatchdogConfig result{}; result.device_file_path = fb_wd->device_file_path()->str(); - auto max_timeout_ms = secondsToMs(*max_timeout); - if (!max_timeout_ms.has_value()) - { - LM_LOG_ERROR() << "Invalid value for Watchdog::max_timeout"; - return score::cpp::make_unexpected(max_timeout_ms.error()); - } - result.max_timeout_ms = *max_timeout_ms; + result.max_timeout_ms = *max_timeout; result.deactivate_on_shutdown = *deactivate_on_shutdown; result.require_magic_close = *require_magic_close; return std::optional{std::move(result)}; diff --git a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.hpp b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.hpp index f1a478586..9b63b7157 100644 --- a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.hpp +++ b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters.hpp @@ -40,16 +40,16 @@ namespace details template score::cpp::expected validateRange(int64_t value, const std::string_view field_name) { - // Asserts ensure that std::numeric_limits::min() and std::numeric_limits::max() can be + // Asserts ensure that std::numeric_limits::min() and std::numeric_limits::max() can be // safely cast to int64_t for the range check: // Case 1: TargetT is unsigned and smaller than int64_t, so max fits in int64_t and min is 0 // Case 2: TargetT is signed and smaller than int64_t, so both min and max fit in int64_t // Case 3: TargetT is signed and exactly int64_t, so min and max are the full int64_t range static_assert(std::numeric_limits::is_integer, "TargetT must be an integer type"); - static_assert(sizeof(TargetT) < sizeof(int64_t) || - (sizeof(TargetT) == sizeof(int64_t) && std::is_signed_v), - "TargetT max must be representable as int64_t"); + static_assert( + sizeof(TargetT) < sizeof(int64_t) || (sizeof(TargetT) == sizeof(int64_t) && std::is_signed_v), + "TargetT max must be representable as int64_t"); if (value < static_cast(std::numeric_limits::min()) || value > static_cast(std::numeric_limits::max())) @@ -63,15 +63,12 @@ score::cpp::expected validateRange(int64_t value, // --- Scalar and enum helpers --- -/// @brief Converts a time value from seconds to milliseconds. -[[nodiscard]] score::cpp::expected secondsToMs(double seconds); /// @brief Converts a FlatBuffer ApplicationType enum to the config ApplicationType. [[nodiscard]] ApplicationType convertApplicationType(fb::ApplicationType fb_type); /// @brief Converts a FlatBuffer ProcessState enum to the config ProcessState. [[nodiscard]] ProcessState convertProcessState(fb::ProcessState fb_state); /// @brief Converts a FlatBuffer SchedulingPolicy enum to a POSIX scheduling policy constant. -[[nodiscard]] score::cpp::expected convertSchedulingPolicy( - fb::SchedulingPolicy policy); +[[nodiscard]] score::cpp::expected convertSchedulingPolicy(fb::SchedulingPolicy policy); // --- String and vector helpers --- @@ -93,16 +90,15 @@ score::cpp::expected validateRange(int64_t value, [[nodiscard]] score::cpp::expected, IConfigLoader::Error> convertRestartAction( const fb::RestartAction* ra); /// @brief Converts a FlatBuffer SwitchRunTargetAction to a config SwitchRunTargetAction, or nullopt if absent. -[[nodiscard]] std::optional convertSwitchRunTargetAction( - const fb::SwitchRunTargetAction* sa); +[[nodiscard]] std::optional convertSwitchRunTargetAction(const fb::SwitchRunTargetAction* sa); /// @brief Converts a required FlatBuffer SwitchRunTargetAction; asserts if null. [[nodiscard]] SwitchRunTargetAction convertRequiredSwitchRunTargetAction(const fb::SwitchRunTargetAction* sa); // --- Component converters --- /// @brief Converts a FlatBuffer ComponentAliveSupervision to the config equivalent. -[[nodiscard]] score::cpp::expected -convertComponentAliveSupervision(const fb::ComponentAliveSupervision* fb_cas); +[[nodiscard]] score::cpp::expected convertComponentAliveSupervision( + const fb::ComponentAliveSupervision* fb_cas); /// @brief Converts a FlatBuffer ApplicationProfile to the config equivalent. [[nodiscard]] score::cpp::expected convertApplicationProfile( const fb::ApplicationProfile* fb_ap); @@ -127,8 +123,7 @@ convertComponentAliveSupervision(const fb::ComponentAliveSupervision* fb_cas); // --- Run target converters --- /// @brief Converts a single FlatBuffer RunTarget to a RunTargetConfig. -[[nodiscard]] score::cpp::expected convertRunTarget( - const fb::RunTarget* fb_rt); +[[nodiscard]] score::cpp::expected convertRunTarget(const fb::RunTarget* fb_rt); /// @brief Converts a FlatBuffer FallbackRunTarget to a FallbackRunTargetConfig. [[nodiscard]] score::cpp::expected convertFallbackRunTarget( const fb::FallbackRunTarget* fb_frt); diff --git a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters_UT.cpp b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters_UT.cpp index 2c62fef23..706deb73e 100644 --- a/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters_UT.cpp +++ b/score/launch_manager/src/daemon/src/configuration/details/flatbuffer_type_converters_UT.cpp @@ -16,10 +16,10 @@ #include #include -#include -#include #include #include +#include +#include #include namespace score::mw::launch_manager::configuration @@ -39,13 +39,14 @@ using ::testing::IsTrue; ::flatbuffers::Offset buildDefaultSandbox(::flatbuffers::FlatBufferBuilder& fbb) { - return fb::CreateSandbox(fbb, - 0 /*uid*/, - 0 /*gid*/, - 0 /*supplementary_group_ids*/, - 0 /*security_policy*/, - fb::SchedulingPolicy::OTHER, - 0 /*scheduling_priority*/); + return fb::CreateSandbox( + fbb, + 0 /*uid*/, + 0 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); } // ============================================================================ @@ -62,64 +63,6 @@ class TypeConverterTestBase : public ::testing::Test } }; -// ============================================================================ -// secondsToMs tests -// ============================================================================ - -class SecondsToMsTest : public TypeConverterTestBase -{ -}; - -TEST_F(SecondsToMsTest, ConvertsPositiveValue) -{ - RecordProperty("Description", "A positive seconds value converts to milliseconds."); - - auto result = details::secondsToMs(1.5); - - ASSERT_THAT(result.has_value(), IsTrue()); - EXPECT_THAT(*result, Eq(1500U)); -} - -TEST_F(SecondsToMsTest, ConvertsZero) -{ - RecordProperty("Description", "Zero seconds converts to zero milliseconds."); - - auto result = details::secondsToMs(0.0); - - ASSERT_THAT(result.has_value(), IsTrue()); - EXPECT_THAT(*result, Eq(0U)); -} - -TEST_F(SecondsToMsTest, RejectsNegativeValue) -{ - RecordProperty("Description", "A negative seconds value returns InvalidFormat."); - - auto result = details::secondsToMs(-1.0); - - ASSERT_THAT(result.has_value(), IsFalse()); - EXPECT_THAT(result.error(), Eq(IConfigLoader::Error::InvalidFormat)); -} - -TEST_F(SecondsToMsTest, RejectsOverflow) -{ - RecordProperty("Description", "A value exceeding uint32_t max milliseconds returns InvalidFormat."); - - auto result = details::secondsToMs(5000000.0); - - ASSERT_THAT(result.has_value(), IsFalse()); - EXPECT_THAT(result.error(), Eq(IConfigLoader::Error::InvalidFormat)); -} - -TEST_F(SecondsToMsTest, RejectsSubMillisecond) -{ - RecordProperty("Description", "A positive value that rounds to 0ms returns InvalidFormat."); - - auto result = details::secondsToMs(0.0001); - - ASSERT_THAT(result.has_value(), IsFalse()); - EXPECT_THAT(result.error(), Eq(IConfigLoader::Error::InvalidFormat)); -} - // ============================================================================ // Enum conversion tests // ============================================================================ @@ -135,8 +78,7 @@ struct ApplicationTypeTestParam const char* name; }; -class ApplicationTypeTest : public TypeConverterTestBase, - public ::testing::WithParamInterface +class ApplicationTypeTest : public TypeConverterTestBase, public ::testing::WithParamInterface { }; @@ -147,23 +89,20 @@ TEST_P(ApplicationTypeTest, ConvertsToExpectedValue) EXPECT_THAT(details::convertApplicationType(GetParam().fb_type), Eq(GetParam().expected)); } -INSTANTIATE_TEST_SUITE_P(ApplicationTypes, - ApplicationTypeTest, - ::testing::Values(ApplicationTypeTestParam{fb::ApplicationType::Native, - ApplicationType::Native, - "Native"}, - ApplicationTypeTestParam{fb::ApplicationType::Reporting, - ApplicationType::Reporting, - "Reporting"}, - ApplicationTypeTestParam{fb::ApplicationType::Reporting_And_Supervised, - ApplicationType::ReportingAndSupervised, - "ReportingAndSupervised"}, - ApplicationTypeTestParam{fb::ApplicationType::State_Manager, - ApplicationType::StateManager, - "StateManager"}), - [](const ::testing::TestParamInfo& info) { - return info.param.name; - }); +INSTANTIATE_TEST_SUITE_P( + ApplicationTypes, + ApplicationTypeTest, + ::testing::Values( + ApplicationTypeTestParam{fb::ApplicationType::Native, ApplicationType::Native, "Native"}, + ApplicationTypeTestParam{fb::ApplicationType::Reporting, ApplicationType::Reporting, "Reporting"}, + ApplicationTypeTestParam{ + fb::ApplicationType::Reporting_And_Supervised, + ApplicationType::ReportingAndSupervised, + "ReportingAndSupervised"}, + ApplicationTypeTestParam{fb::ApplicationType::State_Manager, ApplicationType::StateManager, "StateManager"}), + [](const ::testing::TestParamInfo& info) { + return info.param.name; + }); struct ProcessStateTestParam { @@ -172,8 +111,7 @@ struct ProcessStateTestParam const char* name; }; -class ProcessStateTest : public TypeConverterTestBase, - public ::testing::WithParamInterface +class ProcessStateTest : public TypeConverterTestBase, public ::testing::WithParamInterface { }; @@ -184,17 +122,15 @@ TEST_P(ProcessStateTest, ConvertsToExpectedValue) EXPECT_THAT(details::convertProcessState(GetParam().fb_state), Eq(GetParam().expected)); } -INSTANTIATE_TEST_SUITE_P(ProcessStates, - ProcessStateTest, - ::testing::Values(ProcessStateTestParam{fb::ProcessState::Running, - ProcessState::Running, - "Running"}, - ProcessStateTestParam{fb::ProcessState::Terminated, - ProcessState::Terminated, - "Terminated"}), - [](const ::testing::TestParamInfo& info) { - return info.param.name; - }); +INSTANTIATE_TEST_SUITE_P( + ProcessStates, + ProcessStateTest, + ::testing::Values( + ProcessStateTestParam{fb::ProcessState::Running, ProcessState::Running, "Running"}, + ProcessStateTestParam{fb::ProcessState::Terminated, ProcessState::Terminated, "Terminated"}), + [](const ::testing::TestParamInfo& info) { + return info.param.name; + }); struct SchedulingPolicyTestParam { @@ -217,20 +153,16 @@ TEST_P(SchedulingPolicyTest, ConvertsToExpectedPosixValue) EXPECT_THAT(*result, Eq(GetParam().expected_posix_value)); } -INSTANTIATE_TEST_SUITE_P(SchedulingPolicies, - SchedulingPolicyTest, - ::testing::Values(SchedulingPolicyTestParam{fb::SchedulingPolicy::OTHER, - SCHED_OTHER, - "SCHED_OTHER"}, - SchedulingPolicyTestParam{fb::SchedulingPolicy::FIFO, - SCHED_FIFO, - "SCHED_FIFO"}, - SchedulingPolicyTestParam{fb::SchedulingPolicy::RR, - SCHED_RR, - "SCHED_RR"}), - [](const ::testing::TestParamInfo& info) { - return info.param.name; - }); +INSTANTIATE_TEST_SUITE_P( + SchedulingPolicies, + SchedulingPolicyTest, + ::testing::Values( + SchedulingPolicyTestParam{fb::SchedulingPolicy::OTHER, SCHED_OTHER, "SCHED_OTHER"}, + SchedulingPolicyTestParam{fb::SchedulingPolicy::FIFO, SCHED_FIFO, "SCHED_FIFO"}, + SchedulingPolicyTestParam{fb::SchedulingPolicy::RR, SCHED_RR, "SCHED_RR"}), + [](const ::testing::TestParamInfo& info) { + return info.param.name; + }); TEST_F(EnumConversionTest, ConvertSchedulingPolicyUnsupported) { @@ -295,8 +227,8 @@ TYPED_TEST(ValidateRangeTest, AcceptsMinBoundary) { this->RecordProperty("Description", "The minimum value of the target type is accepted."); - auto result = details::validateRange( - static_cast(std::numeric_limits::min()), "test_field"); + auto result = + details::validateRange(static_cast(std::numeric_limits::min()), "test_field"); ASSERT_THAT(result.has_value(), IsTrue()); EXPECT_THAT(*result, Eq(std::numeric_limits::min())); @@ -306,8 +238,8 @@ TYPED_TEST(ValidateRangeTest, AcceptsMaxBoundary) { this->RecordProperty("Description", "The maximum value of the target type is accepted."); - auto result = details::validateRange( - static_cast(std::numeric_limits::max()), "test_field"); + auto result = + details::validateRange(static_cast(std::numeric_limits::max()), "test_field"); ASSERT_THAT(result.has_value(), IsTrue()); EXPECT_THAT(*result, Eq(std::numeric_limits::max())); @@ -379,7 +311,7 @@ TEST_F(ConverterTest, ConvertRestartActionValid) { RecordProperty("Description", "convertRestartAction with valid fields returns correct values."); ::flatbuffers::FlatBufferBuilder fbb; - auto ra = fb::CreateRestartAction(fbb, 3 /*number_of_attempts*/, 1.5 /*delay_before_restart*/); + auto ra = fb::CreateRestartAction(fbb, 3 /*number_of_attempts*/, 1500 /*delay_before_restart_ms*/); fbb.Finish(ra); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -438,7 +370,7 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionValid) RecordProperty("Description", "convertComponentAliveSupervision maps all fields correctly."); ::flatbuffers::FlatBufferBuilder fbb; auto cas = fb::CreateComponentAliveSupervision( - fbb, 0.5 /*reporting_cycle*/, 2 /*failed_cycles_tolerance*/, 1 /*min_indications*/, 3 /*max_indications*/); + fbb, 500 /*reporting_cycle_ms*/, 2 /*failed_cycles_tolerance*/, 1 /*min_indications*/, 3 /*max_indications*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -456,7 +388,8 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionMissingReportingCycleRetur { RecordProperty("Description", "Missing reporting_cycle returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto cas = fb::CreateComponentAliveSupervision(fbb, ::flatbuffers::nullopt /*reporting_cycle*/, 3 /*failed_cycles_tolerance*/); + auto cas = fb::CreateComponentAliveSupervision( + fbb, ::flatbuffers::nullopt /*reporting_cycle_ms*/, 3 /*failed_cycles_tolerance*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -469,7 +402,8 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionMissingToleranceReturnsErr { RecordProperty("Description", "Missing failed_cycles_tolerance returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto cas = fb::CreateComponentAliveSupervision(fbb, 1.0 /*reporting_cycle*/, ::flatbuffers::nullopt /*failed_cycles_tolerance*/); + auto cas = fb::CreateComponentAliveSupervision( + fbb, 1000 /*reporting_cycle_ms*/, ::flatbuffers::nullopt /*failed_cycles_tolerance*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -482,7 +416,7 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionBothIndicationsAbsentRetur { RecordProperty("Description", "Both min/max_indications absent returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto cas = fb::CreateComponentAliveSupervision(fbb, 1.0 /*reporting_cycle*/, 3 /*failed_cycles_tolerance*/); + auto cas = fb::CreateComponentAliveSupervision(fbb, 1000 /*reporting_cycle_ms*/, 3 /*failed_cycles_tolerance*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -495,7 +429,8 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionOnlyMinIndicationsPresent) { RecordProperty("Description", "Only min_indications set is accepted, max_indications remains nullopt."); ::flatbuffers::FlatBufferBuilder fbb; - auto cas = fb::CreateComponentAliveSupervision(fbb, 1.0 /*reporting_cycle*/, 3 /*failed_cycles_tolerance*/, 2 /*min_indications*/); + auto cas = fb::CreateComponentAliveSupervision( + fbb, 1000 /*reporting_cycle_ms*/, 3 /*failed_cycles_tolerance*/, 2 /*min_indications*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -510,7 +445,12 @@ TEST_F(ConverterTest, ConvertComponentAliveSupervisionOnlyMaxIndicationsPresent) { RecordProperty("Description", "Only max_indications set is accepted, min_indications remains nullopt."); ::flatbuffers::FlatBufferBuilder fbb; - auto cas = fb::CreateComponentAliveSupervision(fbb, 1.0 /*reporting_cycle*/, 3 /*failed_cycles_tolerance*/, ::flatbuffers::nullopt /*min_indications*/, 5 /*max_indications*/); + auto cas = fb::CreateComponentAliveSupervision( + fbb, + 1000 /*reporting_cycle_ms*/, + 3 /*failed_cycles_tolerance*/, + ::flatbuffers::nullopt /*min_indications*/, + 5 /*max_indications*/); fbb.Finish(cas); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -525,7 +465,8 @@ TEST_F(ConverterTest, ConvertApplicationProfileValid) { RecordProperty("Description", "convertApplicationProfile maps all fields correctly."); ::flatbuffers::FlatBufferBuilder fbb; - auto ap = fb::CreateApplicationProfile(fbb, fb::ApplicationType::Reporting_And_Supervised, true /*is_self_terminating*/); + auto ap = + fb::CreateApplicationProfile(fbb, fb::ApplicationType::Reporting_And_Supervised, true /*is_self_terminating*/); fbb.Finish(ap); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -539,7 +480,8 @@ TEST_F(ConverterTest, ConvertApplicationProfileMissingTypeReturnsError) { RecordProperty("Description", "Missing application_type returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto ap = fb::CreateApplicationProfile(fbb, ::flatbuffers::nullopt /*application_type*/, false /*is_self_terminating*/); + auto ap = + fb::CreateApplicationProfile(fbb, ::flatbuffers::nullopt /*application_type*/, false /*is_self_terminating*/); fbb.Finish(ap); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -552,7 +494,8 @@ TEST_F(ConverterTest, ConvertApplicationProfileMissingSelfTerminatingReturnsErro { RecordProperty("Description", "Missing is_self_terminating returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto ap = fb::CreateApplicationProfile(fbb, fb::ApplicationType::Native, ::flatbuffers::nullopt /*is_self_terminating*/); + auto ap = + fb::CreateApplicationProfile(fbb, fb::ApplicationType::Native, ::flatbuffers::nullopt /*is_self_terminating*/); fbb.Finish(ap); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -593,15 +536,16 @@ TEST_F(ConverterTest, ConvertSandboxValid) ::flatbuffers::FlatBufferBuilder fbb; auto sec_policy = fbb.CreateString("strict"); auto supp_gids = fbb.CreateVector(std::vector{100, 200}); - auto sandbox = fb::CreateSandbox(fbb, - 1000 /*uid*/, - 1000 /*gid*/, - supp_gids, - sec_policy, - fb::SchedulingPolicy::FIFO, - 50 /*scheduling_priority*/, - 4096 /*max_memory_usage*/, - 80 /*max_cpu_usage*/); + auto sandbox = fb::CreateSandbox( + fbb, + 1000 /*uid*/, + 1000 /*gid*/, + supp_gids, + sec_policy, + fb::SchedulingPolicy::FIFO, + 50 /*scheduling_priority*/, + 4096 /*max_memory_usage*/, + 80 /*max_cpu_usage*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -624,7 +568,14 @@ TEST_F(ConverterTest, ConvertSandboxMissingUidReturnsError) { RecordProperty("Description", "Sandbox without uid returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto sandbox = fb::CreateSandbox(fbb, ::flatbuffers::nullopt /*uid*/, 0 /*gid*/, 0 /*supplementary_group_ids*/, 0 /*security_policy*/, fb::SchedulingPolicy::OTHER, 0 /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + ::flatbuffers::nullopt /*uid*/, + 0 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -637,7 +588,14 @@ TEST_F(ConverterTest, ConvertSandboxMissingGidReturnsError) { RecordProperty("Description", "Sandbox without gid returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto sandbox = fb::CreateSandbox(fbb, 0 /*uid*/, ::flatbuffers::nullopt /*gid*/, 0 /*supplementary_group_ids*/, 0 /*security_policy*/, fb::SchedulingPolicy::OTHER, 0 /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + 0 /*uid*/, + ::flatbuffers::nullopt /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -650,7 +608,14 @@ TEST_F(ConverterTest, ConvertSandboxMissingSchedulingPolicyReturnsError) { RecordProperty("Description", "Sandbox without scheduling_policy returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto sandbox = fb::CreateSandbox(fbb, 0 /*uid*/, 0 /*gid*/, 0 /*supplementary_group_ids*/, 0 /*security_policy*/, ::flatbuffers::nullopt /*scheduling_policy*/, 0 /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + 0 /*uid*/, + 0 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + ::flatbuffers::nullopt /*scheduling_policy*/, + 0 /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -663,7 +628,14 @@ TEST_F(ConverterTest, ConvertSandboxMissingSchedulingPriorityReturnsError) { RecordProperty("Description", "Sandbox without scheduling_priority returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto sandbox = fb::CreateSandbox(fbb, 0 /*uid*/, 0 /*gid*/, 0 /*supplementary_group_ids*/, 0 /*security_policy*/, fb::SchedulingPolicy::OTHER, ::flatbuffers::nullopt /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + 0 /*uid*/, + 0 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + ::flatbuffers::nullopt /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -677,12 +649,14 @@ TEST_F(ConverterTest, ConvertSandboxUidOutOfRangeReturnsError) RecordProperty("Description", "Sandbox uid exceeding uid_t range returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; - auto sandbox = fb::CreateSandbox(fbb, - std::numeric_limits::max() /*uid*/, - 1000 /*gid*/, - 0 /*supplementary_group_ids*/, 0 /*security_policy*/, - fb::SchedulingPolicy::OTHER, - 0 /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + std::numeric_limits::max() /*uid*/, + 1000 /*gid*/, + 0 /*supplementary_group_ids*/, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -697,13 +671,14 @@ TEST_F(ConverterTest, ConvertSandboxSupplementaryGidOutOfRangeReturnsError) ::flatbuffers::FlatBufferBuilder fbb; auto supp_gids = fbb.CreateVector(std::vector{100, std::numeric_limits::max()}); - auto sandbox = fb::CreateSandbox(fbb, - 1000 /*uid*/, - 1000 /*gid*/, - supp_gids, - 0 /*security_policy*/, - fb::SchedulingPolicy::OTHER, - 0 /*scheduling_priority*/); + auto sandbox = fb::CreateSandbox( + fbb, + 1000 /*uid*/, + 1000 /*gid*/, + supp_gids, + 0 /*security_policy*/, + fb::SchedulingPolicy::OTHER, + 0 /*scheduling_priority*/); fbb.Finish(sandbox); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -720,8 +695,15 @@ TEST_F(ConverterTest, ConvertDeploymentConfigValid) auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); auto deploy = fb::CreateDeploymentConfig( - fbb, 1.5 /*ready_timeout*/, 2.5 /*shutdown_timeout*/, 0 /*environmental_variables*/, - bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + fbb, + 1500 /*ready_timeout_ms*/, + 2500 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); fbb.Finish(deploy); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -742,7 +724,16 @@ TEST_F(ConverterTest, ConvertDeploymentConfigMissingReadyTimeoutReturnsError) auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, ::flatbuffers::nullopt /*ready_timeout*/, 1.0 /*shutdown_timeout*/, 0 /*environmental_variables*/, bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + ::flatbuffers::nullopt /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); fbb.Finish(deploy); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -758,7 +749,16 @@ TEST_F(ConverterTest, ConvertDeploymentConfigMissingShutdownTimeoutReturnsError) auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, 1.0 /*ready_timeout*/, ::flatbuffers::nullopt /*shutdown_timeout*/, 0 /*environmental_variables*/, bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 1000 /*ready_timeout_ms*/, + ::flatbuffers::nullopt /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); fbb.Finish(deploy); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -775,12 +775,22 @@ TEST_F(ConverterTest, ConvertComponentValid) auto app_profile = fb::CreateApplicationProfile(fbb, fb::ApplicationType::Native, false /*is_self_terminating*/); auto bin_name = fbb.CreateString("my_binary"); auto ready_cond = fb::CreateReadyCondition(fbb, fb::ProcessState::Running); - auto comp_props = fb::CreateComponentProperties(fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); + auto comp_props = fb::CreateComponentProperties( + fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, 1.0 /*ready_timeout*/, 1.0 /*shutdown_timeout*/, 0 /*environmental_variables*/, bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 1000 /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp_name = fbb.CreateString("TestComp"); auto comp_desc = fbb.CreateString("A test component"); @@ -802,14 +812,25 @@ TEST_F(ConverterTest, ConvertComponentsValid) ::flatbuffers::FlatBufferBuilder fbb; auto build_comp = [&](const char* name) { - auto app_profile = fb::CreateApplicationProfile(fbb, fb::ApplicationType::Native, false /*is_self_terminating*/); + auto app_profile = + fb::CreateApplicationProfile(fbb, fb::ApplicationType::Native, false /*is_self_terminating*/); auto bin_name = fbb.CreateString(name); auto ready_cond = fb::CreateReadyCondition(fbb, fb::ProcessState::Running); - auto comp_props = fb::CreateComponentProperties(fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); + auto comp_props = fb::CreateComponentProperties( + fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, 1.0 /*ready_timeout*/, 1.0 /*shutdown_timeout*/, 0 /*environmental_variables*/, bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 1000 /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp_name = fbb.CreateString(name); return fb::CreateComponent(fbb, comp_name, 0 /*description*/, comp_props, deploy); }; @@ -835,14 +856,25 @@ TEST_F(ConverterTest, ConvertComponentsWithInvalidComponentReturnsError) RecordProperty("Description", "convertComponents returns error when a component has invalid fields."); ::flatbuffers::FlatBufferBuilder fbb; - auto app_profile = fb::CreateApplicationProfile(fbb, ::flatbuffers::nullopt /*application_type*/, false /*is_self_terminating*/); + auto app_profile = + fb::CreateApplicationProfile(fbb, ::flatbuffers::nullopt /*application_type*/, false /*is_self_terminating*/); auto bin_name = fbb.CreateString("bad_bin"); auto ready_cond = fb::CreateReadyCondition(fbb, fb::ProcessState::Running); - auto comp_props = fb::CreateComponentProperties(fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); + auto comp_props = fb::CreateComponentProperties( + fbb, bin_name, app_profile, 0 /*depends_on*/, 0 /*process_arguments*/, ready_cond); auto bin_dir = fbb.CreateString("/opt"); auto work_dir = fbb.CreateString("/tmp"); auto sandbox = buildDefaultSandbox(fbb); - auto deploy = fb::CreateDeploymentConfig(fbb, 1.0 /*ready_timeout*/, 1.0 /*shutdown_timeout*/, 0 /*environmental_variables*/, bin_dir, work_dir, 0 /*ready_recovery_action*/, 0 /*recovery_action*/, sandbox); + auto deploy = fb::CreateDeploymentConfig( + fbb, + 1000 /*ready_timeout_ms*/, + 1000 /*shutdown_timeout_ms*/, + 0 /*environmental_variables*/, + bin_dir, + work_dir, + 0 /*ready_recovery_action*/, + 0 /*recovery_action*/, + sandbox); auto comp_name = fbb.CreateString("BadComp"); auto comp = fb::CreateComponent(fbb, comp_name, 0 /*description*/, comp_props, deploy); auto comps = fbb.CreateVector(std::vector<::flatbuffers::Offset>{comp}); @@ -864,7 +896,8 @@ TEST_F(ConverterTest, ConvertRunTargetsValid) auto switch_target = fbb.CreateString(recovery_target); auto switch_action = fb::CreateSwitchRunTargetAction(fbb, switch_target); auto rt_name = fbb.CreateString(name); - return fb::CreateRunTarget(fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, 1.0 /*transition_timeout*/, switch_action); + return fb::CreateRunTarget( + fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, 1000 /*transition_timeout_ms*/, switch_action); }; auto rt_a = build_rt("Startup", "SafeState"); @@ -891,7 +924,13 @@ TEST_F(ConverterTest, ConvertRunTargetsWithInvalidRunTargetReturnsError) auto switch_target = fbb.CreateString("SafeState"); auto switch_action = fb::CreateSwitchRunTargetAction(fbb, switch_target); auto rt_name = fbb.CreateString("BadRT"); - auto rt = fb::CreateRunTarget(fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, ::flatbuffers::nullopt /*transition_timeout*/, switch_action); + auto rt = fb::CreateRunTarget( + fbb, + rt_name, + 0 /*description*/, + 0 /*depends_on*/, + ::flatbuffers::nullopt /*transition_timeout*/, + switch_action); auto rts = fbb.CreateVector(std::vector<::flatbuffers::Offset>{rt}); fbb.Finish(rts); const auto* ptr = @@ -913,7 +952,7 @@ TEST_F(ConverterTest, ConvertRunTargetValid) auto rt_desc = fbb.CreateString("Initial state"); auto rt_dep = fbb.CreateString("component_a"); auto rt_deps = fbb.CreateVector(std::vector<::flatbuffers::Offset<::flatbuffers::String>>{rt_dep}); - auto rt = fb::CreateRunTarget(fbb, rt_name, rt_desc, rt_deps, 5.0 /*transition_timeout*/, switch_action); + auto rt = fb::CreateRunTarget(fbb, rt_name, rt_desc, rt_deps, 5000 /*transition_timeout_ms*/, switch_action); fbb.Finish(rt); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -934,7 +973,13 @@ TEST_F(ConverterTest, ConvertRunTargetMissingTransitionTimeoutReturnsError) auto switch_target = fbb.CreateString("SafeState"); auto switch_action = fb::CreateSwitchRunTargetAction(fbb, switch_target); auto rt_name = fbb.CreateString("Startup"); - auto rt = fb::CreateRunTarget(fbb, rt_name, 0 /*description*/, 0 /*depends_on*/, ::flatbuffers::nullopt /*transition_timeout*/, switch_action); + auto rt = fb::CreateRunTarget( + fbb, + rt_name, + 0 /*description*/, + 0 /*depends_on*/, + ::flatbuffers::nullopt /*transition_timeout_ms*/, + switch_action); fbb.Finish(rt); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -950,7 +995,7 @@ TEST_F(ConverterTest, ConvertFallbackRunTargetValid) auto desc = fbb.CreateString("Fallback state"); auto dep = fbb.CreateString("critical_comp"); auto deps = fbb.CreateVector(std::vector<::flatbuffers::Offset<::flatbuffers::String>>{dep}); - auto frt = fb::CreateFallbackRunTarget(fbb, desc, deps, 10.0 /*transition_timeout*/); + auto frt = fb::CreateFallbackRunTarget(fbb, desc, deps, 10000 /*transition_timeout_ms*/); fbb.Finish(frt); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -987,7 +1032,7 @@ TEST_F(ConverterTest, ConvertAliveSupervisionValid) { RecordProperty("Description", "convertAliveSupervision maps evaluation_cycle correctly."); ::flatbuffers::FlatBufferBuilder fbb; - auto as = fb::CreateAliveSupervision(fbb, 0.25 /*evaluation_cycle*/); + auto as = fb::CreateAliveSupervision(fbb, 250 /*evaluation_cycle_ms*/); fbb.Finish(as); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -1022,7 +1067,7 @@ TEST_F(ConverterTest, ConvertWatchdogValid) RecordProperty("Description", "convertWatchdog maps all fields correctly."); ::flatbuffers::FlatBufferBuilder fbb; auto dev_path = fbb.CreateString("/dev/watchdog0"); - auto wd = fb::CreateWatchdog(fbb, dev_path, 30.0 /*max_timeout*/, true /*deactivate*/, false /*magic_close*/); + auto wd = fb::CreateWatchdog(fbb, dev_path, 30000 /*max_timeout_ms*/, true /*deactivate*/, false /*magic_close*/); fbb.Finish(wd); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -1040,7 +1085,12 @@ TEST_F(ConverterTest, ConvertWatchdogMissingMaxTimeoutReturnsError) RecordProperty("Description", "Missing max_timeout returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; auto dev_path = fbb.CreateString("/dev/watchdog0"); - auto wd = fb::CreateWatchdog(fbb, dev_path, ::flatbuffers::nullopt /*max_timeout*/, true /*deactivate_on_shutdown*/, false /*require_magic_close*/); + auto wd = fb::CreateWatchdog( + fbb, + dev_path, + ::flatbuffers::nullopt /*max_timeout_ms*/, + true /*deactivate_on_shutdown*/, + false /*require_magic_close*/); fbb.Finish(wd); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -1054,7 +1104,12 @@ TEST_F(ConverterTest, ConvertWatchdogMissingDeactivateReturnsError) RecordProperty("Description", "Missing deactivate_on_shutdown returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; auto dev_path = fbb.CreateString("/dev/watchdog0"); - auto wd = fb::CreateWatchdog(fbb, dev_path, 30.0 /*max_timeout*/, ::flatbuffers::nullopt /*deactivate_on_shutdown*/, false /*require_magic_close*/); + auto wd = fb::CreateWatchdog( + fbb, + dev_path, + 30000 /*max_timeout_ms*/, + ::flatbuffers::nullopt /*deactivate_on_shutdown*/, + false /*require_magic_close*/); fbb.Finish(wd); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); @@ -1068,7 +1123,12 @@ TEST_F(ConverterTest, ConvertWatchdogMissingMagicCloseReturnsError) RecordProperty("Description", "Missing require_magic_close returns InvalidFormat."); ::flatbuffers::FlatBufferBuilder fbb; auto dev_path = fbb.CreateString("/dev/watchdog0"); - auto wd = fb::CreateWatchdog(fbb, dev_path, 30.0 /*max_timeout*/, true /*deactivate_on_shutdown*/, ::flatbuffers::nullopt /*require_magic_close*/); + auto wd = fb::CreateWatchdog( + fbb, + dev_path, + 30000 /*max_timeout_ms*/, + true /*deactivate_on_shutdown*/, + ::flatbuffers::nullopt /*require_magic_close*/); fbb.Finish(wd); const auto* ptr = ::flatbuffers::GetRoot(fbb.GetBufferPointer()); diff --git a/score/launch_manager/src/daemon/src/configuration/details/new_lm_flatcfg.fbs b/score/launch_manager/src/daemon/src/configuration/details/new_lm_flatcfg.fbs index 98e716324..67bae591b 100644 --- a/score/launch_manager/src/daemon/src/configuration/details/new_lm_flatcfg.fbs +++ b/score/launch_manager/src/daemon/src/configuration/details/new_lm_flatcfg.fbs @@ -35,8 +35,8 @@ enum SchedulingPolicy : byte { // Defines the configuration parameters used for alive monitoring of a component. table ComponentAliveSupervision { - // Duration in seconds of the time interval used to verify alive notifications. - reporting_cycle:double = null; // required + // Duration in milliseconds of the time interval used to verify alive notifications. + reporting_cycle:uint32 = null; // required // Maximum number of consecutive reporting cycle failures before recovery is triggered. failed_cycles_tolerance:uint32 = null; // required // Minimum number of checkpoints that must be reported within each reporting_cycle. @@ -74,8 +74,8 @@ table ComponentProperties { table RestartAction { // Maximum number of restart attempts before recovery is considered failed. number_of_attempts:uint32 = null; // required - // Delay in seconds before initiating a restart attempt. - delay_before_restart:double = null; // required + // Delay in milliseconds before initiating a restart attempt. + delay_before_restart:uint32 = null; // required } // Recovery action that switches to a specified Run Target. @@ -112,10 +112,10 @@ table Sandbox { // Deployment configuration for a component. table DeploymentConfig { - // Maximum time in seconds for the component to reach its ready state. - ready_timeout:double = null; // required - // Maximum time in seconds for the component to terminate after SIGTERM. - shutdown_timeout:double = null; // required + // Maximum time in milliseconds for the component to reach its ready state. + ready_timeout:uint32 = null; // required + // Maximum time in milliseconds for the component to terminate after SIGTERM. + shutdown_timeout:uint32 = null; // required // Environment variables passed to the component at startup. environmental_variables:[EnvironmentalVariable]; // optional // Absolute path to the directory where the component is installed. @@ -138,8 +138,8 @@ table RunTarget { description:string; // optional // Names of components and Run Targets that must be activated with this Run Target. depends_on:[string]; // optional - // Time limit in seconds for the Run Target transition. - transition_timeout:double = null; // required + // Time limit in milliseconds for the Run Target transition. + transition_timeout:uint32 = null; // required // Recovery action when a component in this Run Target fails. recovery_action:SwitchRunTargetAction (required); } @@ -156,16 +156,16 @@ table Component { // Global alive supervision configuration. table AliveSupervision { - // Length in seconds of the time window used to assess alive supervision reports. - evaluation_cycle:double = null; // required + // Length in milliseconds of the time window used to assess alive supervision reports. + evaluation_cycle:uint32 = null; // required } // External watchdog device configuration. table Watchdog { // Path to the external watchdog device file (e.g., /dev/watchdog). device_file_path:string (required); // required - // Maximum timeout in seconds configured on the external watchdog. - max_timeout:double = null; // required + // Maximum timeout in milliseconds configured on the external watchdog. + max_timeout:uint32 = null; // required // Whether the watchdog is deactivated during shutdown. deactivate_on_shutdown:bool = null; // required // Whether the magic close sequence is performed on intentional shutdown. @@ -179,8 +179,8 @@ table FallbackRunTarget { description:string; // optional // Names of components and Run Targets that must be activated. depends_on:[string]; // optional - // Time limit in seconds for the Run Target transition. - transition_timeout:double = null; // required + // Time limit in milliseconds for the Run Target transition. + transition_timeout:uint32 = null; // required } // Root configuration table for the S-CORE Launch Manager. diff --git a/score/launch_manager/src/daemon/src/configuration/flatbuffer_config_loader.hpp b/score/launch_manager/src/daemon/src/configuration/flatbuffer_config_loader.hpp index 71bbb3117..d4b9923bb 100644 --- a/score/launch_manager/src/daemon/src/configuration/flatbuffer_config_loader.hpp +++ b/score/launch_manager/src/daemon/src/configuration/flatbuffer_config_loader.hpp @@ -53,7 +53,7 @@ class FlatbufferConfigLoaderImpl : public IConfigLoader { public: /// @brief The configuration schema version supported by this loader. - static constexpr int32_t kExpectedSchemaVersion = 1; + static constexpr int32_t kExpectedSchemaVersion = 2; [[nodiscard]] score::cpp::expected load(const score::filesystem::Path& path) override { diff --git a/scripts/config_mapping/lifecycle_config.py b/scripts/config_mapping/lifecycle_config.py index 680ac4b1f..39681df68 100644 --- a/scripts/config_mapping/lifecycle_config.py +++ b/scripts/config_mapping/lifecycle_config.py @@ -250,7 +250,7 @@ def gen_config(output_dir, config, input_filename, schema_version=None): if is_supervised(comp_props["application_profile"]["application_type"]): alive_sup = comp_props["application_profile"].get("alive_supervision", {}) app_profile["alive_supervision"] = { - "reporting_cycle": alive_sup["reporting_cycle"], + "reporting_cycle": sec_to_ms(alive_sup["reporting_cycle"]), "failed_cycles_tolerance": alive_sup["failed_cycles_tolerance"], "min_indications": alive_sup["min_indications"], "max_indications": alive_sup["max_indications"], @@ -286,8 +286,8 @@ def gen_config(output_dir, config, input_filename, schema_version=None): sandbox_out["max_cpu_usage"] = sandbox["max_cpu_usage"] deployment = { - "ready_timeout": depl_cfg["ready_timeout"], - "shutdown_timeout": depl_cfg["shutdown_timeout"], + "ready_timeout": sec_to_ms(depl_cfg["ready_timeout"]), + "shutdown_timeout": sec_to_ms(depl_cfg["shutdown_timeout"]), "bin_dir": depl_cfg["bin_dir"], "working_dir": depl_cfg["working_dir"], "sandbox": sandbox_out, @@ -304,7 +304,7 @@ def gen_config(output_dir, config, input_filename, schema_version=None): restart = rra.get("restart", rra) deployment["ready_recovery_action"] = { "number_of_attempts": restart.get("number_of_attempts", 0), - "delay_before_restart": restart.get("delay_before_restart", 0), + "delay_before_restart": sec_to_ms(restart.get("delay_before_restart", 0)), } if "recovery_action" in depl_cfg: @@ -323,7 +323,7 @@ def gen_config(output_dir, config, input_filename, schema_version=None): for rt_name, rt_config in config["run_targets"].items(): rt = { "name": rt_name, - "transition_timeout": rt_config.get("transition_timeout", 3), + "transition_timeout": sec_to_ms(rt_config.get("transition_timeout", 3)), "recovery_action": { "run_target": rt_config.get("recovery_action", {}) .get("switch_run_target", {}) @@ -341,7 +341,7 @@ def gen_config(output_dir, config, input_filename, schema_version=None): fallback = config.get("fallback_run_target", {}) fb_out = {} if "transition_timeout" in fallback: - fb_out["transition_timeout"] = fallback["transition_timeout"] + fb_out["transition_timeout"] = sec_to_ms(fallback["transition_timeout"]) if fallback.get("description"): fb_out["description"] = fallback["description"] if "depends_on" in fallback and fallback["depends_on"]: @@ -349,9 +349,9 @@ def gen_config(output_dir, config, input_filename, schema_version=None): out["fallback_run_target"] = fb_out out["alive_supervision"] = { - "evaluation_cycle": config.get("alive_supervision", {}).get( + "evaluation_cycle": sec_to_ms(config.get("alive_supervision", {}).get( "evaluation_cycle", 0.5 - ), + )), } watchdog_config = config.get("watchdog", {}) @@ -364,7 +364,7 @@ def gen_config(output_dir, config, input_filename, schema_version=None): if watchdog_config and required_watchdog_fields.issubset(watchdog_config.keys()): out["watchdog"] = { "device_file_path": watchdog_config["device_file_path"], - "max_timeout": watchdog_config["max_timeout"], + "max_timeout": sec_to_ms(watchdog_config["max_timeout"]), "deactivate_on_shutdown": watchdog_config["deactivate_on_shutdown"], "require_magic_close": watchdog_config["require_magic_close"], } diff --git a/scripts/config_mapping/tests/basic_test/input/lm_config.json b/scripts/config_mapping/tests/basic_test/input/lm_config.json index b35597f9e..0e4c1564b 100644 --- a/scripts/config_mapping/tests/basic_test/input/lm_config.json +++ b/scripts/config_mapping/tests/basic_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "ready_timeout": 0.5, diff --git a/scripts/config_mapping/tests/custom_validation_failures_test/input/lm_config.json b/scripts/config_mapping/tests/custom_validation_failures_test/input/lm_config.json index 66a511521..d0fbe6499 100644 --- a/scripts/config_mapping/tests/custom_validation_failures_test/input/lm_config.json +++ b/scripts/config_mapping/tests/custom_validation_failures_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": {}, "components": { "test_app1": { diff --git a/scripts/config_mapping/tests/empty_health_config_test/input/lm_config.json b/scripts/config_mapping/tests/empty_health_config_test/input/lm_config.json index 217c9d666..c2de58356 100644 --- a/scripts/config_mapping/tests/empty_health_config_test/input/lm_config.json +++ b/scripts/config_mapping/tests/empty_health_config_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { }, diff --git a/scripts/config_mapping/tests/empty_lm_config_test/input/lm_config.json b/scripts/config_mapping/tests/empty_lm_config_test/input/lm_config.json index b880105e9..f9415e128 100644 --- a/scripts/config_mapping/tests/empty_lm_config_test/input/lm_config.json +++ b/scripts/config_mapping/tests/empty_lm_config_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "ready_timeout": 0.5, diff --git a/scripts/config_mapping/tests/health_config_test/input/lm_config.json b/scripts/config_mapping/tests/health_config_test/input/lm_config.json index f86abac21..97737356d 100644 --- a/scripts/config_mapping/tests/health_config_test/input/lm_config.json +++ b/scripts/config_mapping/tests/health_config_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { }, diff --git a/scripts/config_mapping/tests/lm_config_test/input/lm_config.json b/scripts/config_mapping/tests/lm_config_test/input/lm_config.json index f825876f8..5bfb32816 100644 --- a/scripts/config_mapping/tests/lm_config_test/input/lm_config.json +++ b/scripts/config_mapping/tests/lm_config_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "ready_timeout": 0.5, diff --git a/scripts/config_mapping/tests/schema_validation_failure_test/input/lm_config.json b/scripts/config_mapping/tests/schema_validation_failure_test/input/lm_config.json index 9fd06e961..e621893ac 100644 --- a/scripts/config_mapping/tests/schema_validation_failure_test/input/lm_config.json +++ b/scripts/config_mapping/tests/schema_validation_failure_test/input/lm_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": {}, "components": { "test_app1": { diff --git a/tests/integration/complex_monitoring/complex_monitoring.json b/tests/integration/complex_monitoring/complex_monitoring.json index deaf9eaf8..66c691586 100644 --- a/tests/integration/complex_monitoring/complex_monitoring.json +++ b/tests/integration/complex_monitoring/complex_monitoring.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/complex_monitoring", diff --git a/tests/integration/crash_on_startup/crash_on_startup.json b/tests/integration/crash_on_startup/crash_on_startup.json index 1e4367065..fd47a2aac 100644 --- a/tests/integration/crash_on_startup/crash_on_startup.json +++ b/tests/integration/crash_on_startup/crash_on_startup.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/crash_on_startup", diff --git a/tests/integration/incorrect_config_non_reporting/non_reporting_config.json b/tests/integration/incorrect_config_non_reporting/non_reporting_config.json index 4b5fa7514..2c1a0d72b 100644 --- a/tests/integration/incorrect_config_non_reporting/non_reporting_config.json +++ b/tests/integration/incorrect_config_non_reporting/non_reporting_config.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/incorrect_config_non_reporting", diff --git a/tests/integration/process_complex_rep_failure/process_complex_rep_failure.json b/tests/integration/process_complex_rep_failure/process_complex_rep_failure.json index 1d1bac8c9..ef0b9a9b0 100644 --- a/tests/integration/process_complex_rep_failure/process_complex_rep_failure.json +++ b/tests/integration/process_complex_rep_failure/process_complex_rep_failure.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_complex_rep_failure", diff --git a/tests/integration/process_crash_monitoring/process_crash_monitoring.json b/tests/integration/process_crash_monitoring/process_crash_monitoring.json index 443cd4033..4a3c98f1f 100644 --- a/tests/integration/process_crash_monitoring/process_crash_monitoring.json +++ b/tests/integration/process_crash_monitoring/process_crash_monitoring.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_crash_monitoring", diff --git a/tests/integration/process_fd_leak/process_fd_leak.json b/tests/integration/process_fd_leak/process_fd_leak.json index 2a1c20f3e..18db3328f 100644 --- a/tests/integration/process_fd_leak/process_fd_leak.json +++ b/tests/integration/process_fd_leak/process_fd_leak.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_fd_leak", diff --git a/tests/integration/process_launch_args/process_launch_args.json b/tests/integration/process_launch_args/process_launch_args.json index 1d417bc3a..6f7ee58ea 100644 --- a/tests/integration/process_launch_args/process_launch_args.json +++ b/tests/integration/process_launch_args/process_launch_args.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_launch_args", diff --git a/tests/integration/process_simple_rep_failure/process_simple_rep_failure.json b/tests/integration/process_simple_rep_failure/process_simple_rep_failure.json index ae234cd2f..799433838 100644 --- a/tests/integration/process_simple_rep_failure/process_simple_rep_failure.json +++ b/tests/integration/process_simple_rep_failure/process_simple_rep_failure.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_simple_rep_failure", diff --git a/tests/integration/process_wrong_binary_failure/process_wrong_binary_failure.json b/tests/integration/process_wrong_binary_failure/process_wrong_binary_failure.json index 1a0c13860..c9f8dec07 100644 --- a/tests/integration/process_wrong_binary_failure/process_wrong_binary_failure.json +++ b/tests/integration/process_wrong_binary_failure/process_wrong_binary_failure.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/process_wrong_binary_failure", diff --git a/tests/integration/smoke/lifecycle_smoketest.json b/tests/integration/smoke/lifecycle_smoketest.json index 3c0c736b1..f2e379099 100644 --- a/tests/integration/smoke/lifecycle_smoketest.json +++ b/tests/integration/smoke/lifecycle_smoketest.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/smoke", diff --git a/tests/integration/switch_run_target/switch_run_target.json b/tests/integration/switch_run_target/switch_run_target.json index b9e1825a0..90229c012 100644 --- a/tests/integration/switch_run_target/switch_run_target.json +++ b/tests/integration/switch_run_target/switch_run_target.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "defaults": { "deployment_config": { "bin_dir": "/tmp/tests/switch_run_target",