diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 988b1e269..90375cdc6 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.13.1", + "version": "3.13.2", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h index 7a977aadc..661e4b238 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h @@ -2,6 +2,8 @@ #define ARMONIK_API_CONTROLPLANE_H #include "utils/Configuration.h" +#include +#include namespace armonik { namespace api { @@ -9,21 +11,22 @@ namespace common { namespace options { class ControlPlane { public: - ControlPlane(const utils::Configuration &config) { - endpoint_ = config.get(EndpointKey); - user_cert_pem_path_ = config.get(UserCertKey); - user_key_pem_path_ = config.get(UserKeyKey); - user_p12_path_ = config.get(UserP12Key); - ca_cert_pem_path_ = config.get(CaCertKey); - sslValidation_ = config.get(SSLValidationKey) != "disable"; - } + ControlPlane(const utils::Configuration &config); - [[nodiscard]] absl::string_view getEndpoint() const { return endpoint_; } - [[nodiscard]] absl::string_view getUserCertPemPath() const { return user_cert_pem_path_; } - [[nodiscard]] absl::string_view getUserKeyPemPath() const { return user_key_pem_path_; } - [[nodiscard]] absl::string_view getUserP12Path() const { return user_p12_path_; } - [[nodiscard]] absl::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } - [[nodiscard]] bool isSslValidation() const { return sslValidation_; } + absl::string_view getEndpoint() const { return endpoint_; } + absl::string_view getUserCertPemPath() const { return user_cert_pem_path_; } + absl::string_view getUserKeyPemPath() const { return user_key_pem_path_; } + absl::string_view getUserP12Path() const { return user_p12_path_; } + absl::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } + bool isSslValidation() const { return sslValidation_; } + const google::protobuf::Duration &getKeepAliveTime() const { return keep_alive_time_; } + const google::protobuf::Duration &getKeepAliveTimeInterval() const { return keep_alive_time_interval_; } + const google::protobuf::Duration &getMaxIdleTime() const { return max_idle_time_; } + int getMaxAttempts() const { return max_attempts_; } + double getBackoffMultiplier() const { return backoff_multiplier_; } + const google::protobuf::Duration &getInitialBackoff() const { return initial_backoff_; } + const google::protobuf::Duration &getMaxBackoff() const { return max_backoff_; } + const google::protobuf::Duration &getRequestTimeout() const { return request_timeout_; } static constexpr char EndpointKey[] = "Grpc__EndPoint"; static constexpr char UserCertKey[] = "Grpc__ClientCert"; @@ -31,6 +34,14 @@ class ControlPlane { static constexpr char UserP12Key[] = "Grpc__ClientP12"; static constexpr char CaCertKey[] = "Grpc__CaCert"; static constexpr char SSLValidationKey[] = "Grpc__SSLValidation"; + static constexpr char KeepAliveTimeKey[] = "Grpc__KeepAliveTime"; + static constexpr char KeepAliveTimeIntervalKey[] = "Grpc__KeepAliveTimeInterval"; + static constexpr char MaxIdleTimeKey[] = "Grpc__MaxIdleTime"; + static constexpr char MaxAttemptsKey[] = "Grpc__MaxAttempts"; + static constexpr char BackoffMultiplierKey[] = "Grpc__BackoffMultiplier"; + static constexpr char InitialBackOffKey[] = "Grpc__InitialBackOff"; + static constexpr char MaxBackOffKey[] = "Grpc__MaxBackOff"; + static constexpr char RequestTimeoutKey[] = "Grpc__RequestTimeout"; private: std::string endpoint_; @@ -38,6 +49,14 @@ class ControlPlane { std::string user_key_pem_path_; std::string user_p12_path_; std::string ca_cert_pem_path_; + ::google::protobuf::Duration keep_alive_time_; + ::google::protobuf::Duration keep_alive_time_interval_; + ::google::protobuf::Duration max_idle_time_; + int max_attempts_{}; + double backoff_multiplier_{}; + ::google::protobuf::Duration initial_backoff_; + ::google::protobuf::Duration max_backoff_; + ::google::protobuf::Duration request_timeout_; bool sslValidation_; }; } // namespace options diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h b/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h new file mode 100644 index 000000000..d68eb98b1 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h @@ -0,0 +1,33 @@ +#pragma once + +#include "utils/Configuration.h" +#include + +namespace armonik { +namespace api { +namespace common { +namespace utils { +/** + * Get custom channel arguments for channel creation + * @param config Configuration + * @return Channel arguments + */ +::grpc::ChannelArguments getChannelArguments(const Configuration &config); + +/** + * Get custom channel arguments for channel creation + * @param config Control Plane configuration + * @return Channel arguments + */ +::grpc::ChannelArguments getChannelArguments(const options::ControlPlane &config); + +/** + * Generate the service config for the channel arguments + * @param config Control Plane configuration + * @return Json of the service + */ +std::string getServiceConfigJson(const armonik::api::common::options::ControlPlane &config); +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h b/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h new file mode 100644 index 000000000..00f787e00 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h @@ -0,0 +1,33 @@ +#pragma once + +#include "google/protobuf/duration.pb.h" + +namespace armonik { +namespace api { +namespace common { +namespace utils { +/** + * Creates a duration from the given values + * @param days Days + * @param hours Hours + * @param minutes Minutes + * @param seconds Seconds + * @param nanoseconds Nanoseconds + * @return Duration with the right value + * @note Make sure that the resulting number of seconds and the nanoseconds are of the same sign for the duration to be + * valid + */ +::google::protobuf::Duration duration_from_values(long long int days = 0, long long int hours = 0, + long long int minutes = 0, long long int seconds = 0, + int nanoseconds = 0); + +/** + * Creates a duration from timespan string + * @param timespan string with format [-][d.]hh:mm:ss[.fffffffff] + * @return Duration in accordance with timespan + */ +::google::protobuf::Duration duration_from_timespan(const std::string ×pan); +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp b/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp new file mode 100644 index 000000000..e600c4f34 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp @@ -0,0 +1,32 @@ +#include "options/ControlPlane.h" +#include "utils/Configuration.h" +#include "utils/Utils.h" + +armonik::api::common::options::ControlPlane::ControlPlane(const utils::Configuration &config) { + endpoint_ = config.get(EndpointKey); + user_cert_pem_path_ = config.get(UserCertKey); + user_key_pem_path_ = config.get(UserKeyKey); + user_p12_path_ = config.get(UserP12Key); + ca_cert_pem_path_ = config.get(CaCertKey); + sslValidation_ = config.get(SSLValidationKey) != "disable"; + + keep_alive_time_ = config.get(KeepAliveTimeKey).empty() ? utils::duration_from_values(0, 0, 0, 30) + : utils::duration_from_timespan(config.get(KeepAliveTimeKey)); + keep_alive_time_interval_ = config.get(KeepAliveTimeIntervalKey).empty() + ? utils::duration_from_values(0, 0, 0, 30) + : utils::duration_from_timespan(config.get(KeepAliveTimeIntervalKey)); + max_idle_time_ = config.get(MaxIdleTimeKey).empty() ? utils::duration_from_values(0, 0, 5) + : utils::duration_from_timespan(config.get(MaxIdleTimeKey)); + long attempts = std::strtol(config.get(MaxAttemptsKey).c_str(), nullptr, 10); + max_attempts_ = (attempts <= 0 || attempts >= INT_MAX) ? 5 : (int)attempts; + backoff_multiplier_ = strtod(config.get(BackoffMultiplierKey).c_str(), nullptr); + backoff_multiplier_ = backoff_multiplier_ == 0 || backoff_multiplier_ == HUGE_VAL ? 1.5 : backoff_multiplier_; + initial_backoff_ = config.get(InitialBackOffKey).empty() + ? utils::duration_from_values(0, 0, 0, 1) + : utils::duration_from_timespan(config.get(InitialBackOffKey)); + max_backoff_ = config.get(MaxBackOffKey).empty() ? utils::duration_from_values(0, 0, 0, 5) + : utils::duration_from_timespan(config.get(MaxBackOffKey)); + request_timeout_ = config.get(RequestTimeoutKey).empty() + ? utils::duration_from_values(366) + : utils::duration_from_timespan(config.get(RequestTimeoutKey)); +} diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp new file mode 100644 index 000000000..85e3fcb8c --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp @@ -0,0 +1,53 @@ +#include "utils/ChannelArguments.h" +#include "options/ControlPlane.h" +#include +#include + +template T saturate_cast(Tin in, T max_value = std::numeric_limits::max()) { + if (in > max_value) { + return max_value; + } + return static_cast(in); +} + +int getMilliseconds(const google::protobuf::Duration &duration) { + return saturate_cast(duration.seconds() * 1000) + (duration.nanos() / 1000000); +} + +std::string +armonik::api::common::utils::getServiceConfigJson(const armonik::api::common::options::ControlPlane &config) { + std::stringstream ss; + std::string initialBackoff, maxBackoff, timeout; + auto status = google::protobuf::util::MessageToJsonString(config.getInitialBackoff(), &initialBackoff); + if (!status.ok()) { + throw std::invalid_argument("Initial backoff is invalid" + status.ToString()); + } + status = google::protobuf::util::MessageToJsonString(config.getMaxBackoff(), &maxBackoff); + if (!status.ok()) { + throw std::invalid_argument("Max backoff is invalid" + status.ToString()); + } + status = google::protobuf::util::MessageToJsonString(config.getRequestTimeout(), &timeout); + if (!status.ok()) { + throw std::invalid_argument("Timeout is invalid" + status.ToString()); + } + ss << R"({ "methodConfig": [{ "name": [{}], )" + << R"("timeout" : )" << timeout << ',' << R"("retryPolicy" : {)" + << R"("backoffMultiplier": )" << config.getBackoffMultiplier() << ',' << R"("initialBackoff":)" << initialBackoff + << "," + << R"("maxBackoff":)" << maxBackoff << "," + << R"("maxAttempts":)" << config.getMaxAttempts() << ',' + << R"("retryableStatusCodes": [ "UNAVAILABLE", "ABORTED", "UNKNOWN" ])" + << "}}]}"; + return ss.str(); +} + +::grpc::ChannelArguments armonik::api::common::utils::getChannelArguments(const Configuration &config) { + return getChannelArguments(config.get_control_plane()); +} +::grpc::ChannelArguments armonik::api::common::utils::getChannelArguments(const options::ControlPlane &config) { + ::grpc::ChannelArguments args; + args.SetInt(GRPC_ARG_KEEPALIVE_TIME_MS, getMilliseconds(config.getKeepAliveTime())); + args.SetInt(GRPC_ARG_MAX_CONNECTION_IDLE_MS, getMilliseconds(config.getMaxIdleTime())); + args.SetServiceConfigJSON(getServiceConfigJson(config)); + return args; +} diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp index 97451187f..31ffa4bbd 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp @@ -10,6 +10,14 @@ constexpr char armonik::api::common::options::ControlPlane::SSLValidationKey[]; constexpr char armonik::api::common::options::ControlPlane::UserCertKey[]; constexpr char armonik::api::common::options::ControlPlane::UserKeyKey[]; constexpr char armonik::api::common::options::ControlPlane::UserP12Key[]; +constexpr char armonik::api::common::options::ControlPlane::KeepAliveTimeKey[]; +constexpr char armonik::api::common::options::ControlPlane::KeepAliveTimeIntervalKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxIdleTimeKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxAttemptsKey[]; +constexpr char armonik::api::common::options::ControlPlane::BackoffMultiplierKey[]; +constexpr char armonik::api::common::options::ControlPlane::InitialBackOffKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxBackOffKey[]; +constexpr char armonik::api::common::options::ControlPlane::RequestTimeoutKey[]; namespace armonik { namespace api { diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp new file mode 100644 index 000000000..8bc13007b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp @@ -0,0 +1,69 @@ +#include "utils/Utils.h" +#include +#include +#include + +namespace armonik { +namespace api { +namespace common { +namespace utils { + +::google::protobuf::Duration duration_from_values(long long int days, long long int hours, long long int minutes, + long long int seconds, int nanoseconds) { + ::google::protobuf::Duration duration; + duration.set_seconds(days * 86400 + 3600 * hours + 60 * minutes + seconds); + duration.set_nanos(nanoseconds); + return duration; +} + +/** + * Creates a duration from timespan string + * @param timespan string with format [-][d.]hh:mm:ss[.fffffffff] + * @return Duration in accordance with timespan + */ +::google::protobuf::Duration duration_from_timespan(const std::string ×pan) { + auto splitted = absl::StrSplit(timespan, ':'); + std::vector sections(splitted.begin(), splitted.end()); + long days = 0, hours, minutes, seconds; + if (sections.size() != 3) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + // Split the days.hours + auto subsplitted = absl::StrSplit(sections[0], '.'); + std::vector subsplit(subsplitted.begin(), subsplitted.end()); + if (subsplit.size() > 2) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + // Sign is only present in the first section + int sign = absl::StrContains(subsplit[0], '-') ? -1 : 1; + if (subsplit.size() == 2) { + days = std::strtol(subsplit[0].c_str(), nullptr, 10); + hours = sign * std::strtol(subsplit[1].c_str(), nullptr, 10); + } else { + hours = std::strtol(subsplit[0].c_str(), nullptr, 10); + } + + minutes = sign * std::strtol(sections[1].c_str(), nullptr, 10); + subsplitted = absl::StrSplit(sections[2], '.'); + std::vector subsplit_sec(subsplitted.begin(), subsplitted.end()); + if (subsplit_sec.size() > 2) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + int nanos = 0; + seconds = sign * std::strtol(subsplit_sec[0].c_str(), nullptr, 10); + if (subsplit_sec.size() == 2) { + if (subsplit_sec[1].length() >= 9) { + nanos = sign * (int)std::strtol(subsplit_sec[1].substr(0, 9).c_str(), nullptr, 10); + } else { + nanos = sign * + (int)std::strtol((subsplit_sec[1] + std::string(9 - subsplit_sec[1].length(), '0')).c_str(), nullptr, 10); + } + } + + return duration_from_values(days, hours, minutes, seconds, nanos); +} + +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp new file mode 100644 index 000000000..bb322d23f --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -0,0 +1,64 @@ +#include "common.h" +#include "options/ControlPlane.h" +#include "utils/Configuration.h" +#include +#include + +#include "submitter/SubmitterClient.h" +#include "utils/ChannelArguments.h" + +armonik::api::grpc::v1::TaskOptions default_task_options() { + armonik::api::grpc::v1::TaskOptions default_task_options; + default_task_options.mutable_options()->insert({"key1", "value1"}); + default_task_options.mutable_options()->insert({"key2", "value2"}); + default_task_options.mutable_max_duration()->set_seconds(3600); + default_task_options.mutable_max_duration()->set_nanos(0); + default_task_options.set_max_retries(1); + default_task_options.set_priority(1); + default_task_options.set_partition_id(""); + default_task_options.set_application_name("my-app"); + default_task_options.set_application_version("1.0"); + default_task_options.set_application_namespace("my-namespace"); + default_task_options.set_application_service("my-service"); + default_task_options.set_engine_type("Unified"); + return default_task_options; +} + +TEST(Options, no_options) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + auto channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} + +TEST(Options, default_options) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + auto args = armonik::api::common::utils::getChannelArguments(configuration); + auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} + +TEST(Options, test_timeout) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, "0:0:0.001"); // 1ms, way too short + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub( + ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), + armonik::api::common::utils::getChannelArguments(configuration)))); + ASSERT_ANY_THROW(client.create_session(default_task_options(), {})); + configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, + "0:0:10"); // 10s, should have finished by now + client = armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub( + ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), + armonik::api::common::utils::getChannelArguments(configuration)))); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp new file mode 100644 index 000000000..ec7c7a17e --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp @@ -0,0 +1,38 @@ +#include +#include +#include + +#include "utils/Utils.h" + +struct timespan_test_case_from_string { + ::google::protobuf::Duration expected; + std::string value_to_test; +}; + +timespan_test_case_from_string genCaseForString(long seconds, int nanos, const std::string &str) { + timespan_test_case_from_string value; + value.expected.set_seconds(seconds); + value.expected.set_nanos(nanos); + value.value_to_test = str; + return value; +} + +class TestTimespanFromString : public testing::TestWithParam {}; + +TEST_P(TestTimespanFromString, IsWellConverted) { + auto value = GetParam(); + ::google::protobuf::Duration out; + EXPECT_NO_THROW(out = armonik::api::common::utils::duration_from_timespan(value.value_to_test)); + EXPECT_EQ(out.seconds(), value.expected.seconds()); + EXPECT_EQ(out.nanos(), value.expected.nanos()); +} + +INSTANTIATE_TEST_SUITE_P(Timespan_Conversion, TestTimespanFromString, + ::testing::Values(genCaseForString(5, 0, "0:0:5"), genCaseForString(5, 5000, "0:0:5.000005"), + genCaseForString(3605, 0, "1:0:5"), genCaseForString(-3605, 0, "-1:0:5"), + genCaseForString(3605, 0, "1:0:5.0"), genCaseForString(3665, 0, "1:1:5.0"), + genCaseForString(3605, 0, "0.1:0:5.0"), + genCaseForString(90005, 0, "1.1:0:5"), + genCaseForString(90005, 500000000, "1.1:0:5.5"), + genCaseForString(90005, 500000000, "1.1:0:5.50000000000"), + genCaseForString(-90005, -500000000, "-1.1:0:5.5"))); diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 25a9161a5..e9148e02a 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.13.1) +set(version 3.13.2) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 3256df8b4..8d7b5a90e 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.1 + 3.13.2 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index c38cbd2b9..9f4e3f525 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index a8b106f49..d6f0a3cf9 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.13.1 + 3.13.2 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 8c0ad7b64..9ee3c3820 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index b5f40cb48..94d680db2 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 658b93b3b..3a2ae6f57 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index dc4a553c9..ef072ee37 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.1 + 3.13.2 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 3724724dd..3bde89dea 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True True diff --git a/packages/web/package.json b/packages/web/package.json index c7ca47ffd..65dba968a 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.13.1", + "version": "3.13.2", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0",