From b1724d03037ecabb732a9328922c0ee20fb81fa4 Mon Sep 17 00:00:00 2001 From: Ethan Date: Tue, 30 Jul 2024 11:12:18 -0400 Subject: [PATCH] RSDK-8306 - set version in metadata (#271) --- .github/workflows/update_protos.yml | 2 ++ src/viam/api/api_proto_tag.lock | 1 + .../examples/modules/complex/proto/buf.lock | 4 +-- src/viam/sdk/CMakeLists.txt | 12 +++++++ .../common/private/version_metadata.hpp.in | 11 +++++++ src/viam/sdk/common/utils.cpp | 7 +++- src/viam/sdk/common/utils.hpp | 1 + src/viam/sdk/tests/mocks/mock_robot.cpp | 33 ++++++++++++++++--- src/viam/sdk/tests/test_utils.cpp | 2 +- 9 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 src/viam/api/api_proto_tag.lock create mode 100644 src/viam/sdk/common/private/version_metadata.hpp.in diff --git a/.github/workflows/update_protos.yml b/.github/workflows/update_protos.yml index b4a18ad4c..de4600f9a 100644 --- a/.github/workflows/update_protos.yml +++ b/.github/workflows/update_protos.yml @@ -46,6 +46,8 @@ jobs: BOOST_ROOT: ${{ github.workspace }}/boost/boost - name: cleanup run: rm -rf boost/ && rm -rf vcpkg/ + - name: Update proto tag + run: echo "${{ github.event.client_payload.tag }}" > src/viam/api/api_proto_tag.lock - name: Add + Commit + Open PR uses: peter-evans/create-pull-request@v3 with: diff --git a/src/viam/api/api_proto_tag.lock b/src/viam/api/api_proto_tag.lock new file mode 100644 index 000000000..35d19fbfb --- /dev/null +++ b/src/viam/api/api_proto_tag.lock @@ -0,0 +1 @@ +v0.1.327 diff --git a/src/viam/examples/modules/complex/proto/buf.lock b/src/viam/examples/modules/complex/proto/buf.lock index 6a67b8d08..225fe4689 100644 --- a/src/viam/examples/modules/complex/proto/buf.lock +++ b/src/viam/examples/modules/complex/proto/buf.lock @@ -4,5 +4,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: f0e53af8f2fc4556b94f482688b57223 - digest: shake256:de26a277fc28b8b411ecf58729d78d32fcf15090ffd998a4469225b17889bfb51442eaab04bb7a8d88d203ecdf0a9febd4ffd52c18ed1c2229160c7bd353ca95 + commit: 2bbd25900cb34c79bae97d85c948d3cf + digest: shake256:a6446e23f4408160217c22738a0c8c370ff3ff966f601d678960b803829cf53b5cf5998d20fcb3f9c9be944b24337843e7beb6e681ddbf9d036fb6491c0e47e7 diff --git a/src/viam/sdk/CMakeLists.txt b/src/viam/sdk/CMakeLists.txt index 7d44e638e..60c8f807e 100644 --- a/src/viam/sdk/CMakeLists.txt +++ b/src/viam/sdk/CMakeLists.txt @@ -19,6 +19,16 @@ target_include_directories(viamsdk "$>" ) +# Configure the SDK version file +if (VIAMCPPSDK_USE_LOCAL_PROTOS) + set(VIAMCPPSDK_API_PROTO_LABEL "unknown (local generation)") +else() + file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../api/api_proto_tag.lock" VIAMCPPSDK_API_PROTO_LABEL) + string(REGEX REPLACE "\n$" "" VIAMCPPSDK_API_PROTO_LABEL "${VIAMCPPSDK_API_PROTO_LABEL}") +endif() +message(WARNING "api proto label is ${VIAMCPPSDK_API_PROTO_LABEL}") +configure_file(common/private/version_metadata.hpp.in common/private/version_metadata.hpp @ONLY) + # Set compile and link options based on arguments if (VIAMCPPSDK_USE_WALL_WERROR) @@ -189,6 +199,8 @@ target_include_directories(viamsdk "$" "$" "$" + PRIVATE + "$" ) target_link_directories(viamsdk diff --git a/src/viam/sdk/common/private/version_metadata.hpp.in b/src/viam/sdk/common/private/version_metadata.hpp.in new file mode 100644 index 000000000..6ea4e2d85 --- /dev/null +++ b/src/viam/sdk/common/private/version_metadata.hpp.in @@ -0,0 +1,11 @@ +#pragma once + +namespace viam { +namespace sdk { +namespace impl { + +constexpr char k_version[] = "cpp;v@CMAKE_PROJECT_VERSION@;@VIAMCPPSDK_API_PROTO_LABEL@"; + +} // namespace impl +} // namespace sdk +} // namespace viam diff --git a/src/viam/sdk/common/utils.cpp b/src/viam/sdk/common/utils.cpp index 26d0ab888..90ebd56a6 100644 --- a/src/viam/sdk/common/utils.cpp +++ b/src/viam/sdk/common/utils.cpp @@ -1,6 +1,5 @@ #include -#include #include #include @@ -15,6 +14,7 @@ #include +#include #include #include @@ -108,8 +108,13 @@ void ClientContext::set_client_ctx_authority_() { wrapped_context_.set_authority("viam-placeholder"); } +void ClientContext::add_viam_client_version_() { + wrapped_context_.AddMetadata("viam_client", impl::k_version); +} + ClientContext::ClientContext() { set_client_ctx_authority_(); + add_viam_client_version_(); } ClientContext::operator const grpc::ClientContext*() const { diff --git a/src/viam/sdk/common/utils.hpp b/src/viam/sdk/common/utils.hpp index 0f6c1ed8e..893fcacd1 100644 --- a/src/viam/sdk/common/utils.hpp +++ b/src/viam/sdk/common/utils.hpp @@ -61,6 +61,7 @@ class ClientContext { private: void set_client_ctx_authority_(); + void add_viam_client_version_(); grpc::ClientContext wrapped_context_; }; diff --git a/src/viam/sdk/tests/mocks/mock_robot.cpp b/src/viam/sdk/tests/mocks/mock_robot.cpp index db4a384a2..67e750e58 100644 --- a/src/viam/sdk/tests/mocks/mock_robot.cpp +++ b/src/viam/sdk/tests/mocks/mock_robot.cpp @@ -1,6 +1,9 @@ -#include #include +#include + +#include + #include #include @@ -265,9 +268,14 @@ std::vector mock_proto_config_response() { } ::grpc::Status MockRobotService::FrameSystemConfig( - ::grpc::ServerContext*, + ::grpc::ServerContext* context, const ::viam::robot::v1::FrameSystemConfigRequest*, ::viam::robot::v1::FrameSystemConfigResponse* response) { + auto client_md = context->client_metadata(); + if (auto client_info = client_md.find("viam_client"); client_info == client_md.end()) { + return ::grpc::Status(::grpc::StatusCode::FAILED_PRECONDITION, + "viam_client info not properly set in metadata"); + } auto* configs = response->mutable_frame_system_configs(); for (const auto& c : mock_proto_config_response()) { *configs->Add() = c; @@ -276,9 +284,14 @@ ::grpc::Status MockRobotService::FrameSystemConfig( } ::grpc::Status MockRobotService::DiscoverComponents( - ::grpc::ServerContext*, + ::grpc::ServerContext* context, const ::viam::robot::v1::DiscoverComponentsRequest*, ::viam::robot::v1::DiscoverComponentsResponse* response) { + auto client_md = context->client_metadata(); + if (auto client_info = client_md.find("viam_client"); client_info == client_md.end()) { + return ::grpc::Status(::grpc::StatusCode::FAILED_PRECONDITION, + "viam_client info not properly set in metadata"); + } auto* discovery = response->mutable_discovery(); for (auto& d : mock_proto_discovery_response()) { *discovery->Add() = d; @@ -286,16 +299,26 @@ ::grpc::Status MockRobotService::DiscoverComponents( return ::grpc::Status(); } -::grpc::Status MockRobotService::TransformPose(::grpc::ServerContext*, +::grpc::Status MockRobotService::TransformPose(::grpc::ServerContext* context, const ::viam::robot::v1::TransformPoseRequest*, ::viam::robot::v1::TransformPoseResponse* response) { + auto client_md = context->client_metadata(); + if (auto client_info = client_md.find("viam_client"); client_info == client_md.end()) { + return ::grpc::Status(::grpc::StatusCode::FAILED_PRECONDITION, + "viam_client info not properly set in metadata"); + } *response->mutable_pose() = mock_proto_transform_response(); return ::grpc::Status(); } -::grpc::Status MockRobotService::GetOperations(::grpc::ServerContext*, +::grpc::Status MockRobotService::GetOperations(::grpc::ServerContext* context, const ::viam::robot::v1::GetOperationsRequest*, ::viam::robot::v1::GetOperationsResponse* response) { + auto client_md = context->client_metadata(); + if (auto client_info = client_md.find("viam_client"); client_info == client_md.end()) { + return ::grpc::Status(::grpc::StatusCode::FAILED_PRECONDITION, + "viam_client info not properly set in metadata"); + } auto* ops = response->mutable_operations(); for (auto& op : mock_proto_operations_response()) { *ops->Add() = op; diff --git a/src/viam/sdk/tests/test_utils.cpp b/src/viam/sdk/tests/test_utils.cpp index e61062fba..a49f60eea 100644 --- a/src/viam/sdk/tests/test_utils.cpp +++ b/src/viam/sdk/tests/test_utils.cpp @@ -61,7 +61,7 @@ std::vector fake_geometries() { std::move(capsule_config)}; } -TestServer::TestServer(std::shared_ptr sdk_server) : sdk_server_(sdk_server) {} +TestServer::TestServer(std::shared_ptr sdk_server) : sdk_server_(std::move(sdk_server)) {} TestServer::~TestServer() = default;