From 4c97b961db1049fd9d848e74cd868b8e643c90eb Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Mon, 22 Jan 2024 13:20:33 +0300
Subject: [PATCH] feat: .proc_version_info

---
 src/info.rs             | 43 +++++++++++++++++++++++++++++++++++++++++
 src/lib.rs              |  2 ++
 src/luamod.rs           |  2 +-
 test/int/test_basics.py |  5 +++++
 4 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 src/info.rs

diff --git a/src/info.rs b/src/info.rs
new file mode 100644
index 0000000000..975fd36fb3
--- /dev/null
+++ b/src/info.rs
@@ -0,0 +1,43 @@
+use std::borrow::Cow;
+use tarantool::proc;
+
+pub const PICODATA_VERSION: &'static str = std::env!("GIT_DESCRIBE");
+pub const PROC_API_VERSION: &'static str = "0.1.0";
+
+////////////////////////////////////////////////////////////////////////////////
+// VersionInfo
+////////////////////////////////////////////////////////////////////////////////
+
+#[derive(Clone, Debug, ::serde::Serialize, ::serde::Deserialize)]
+pub struct VersionInfo<'a> {
+    pub picodata_version: Cow<'a, str>,
+    pub proc_api_version: Cow<'a, str>,
+}
+
+impl tarantool::tuple::Encode for VersionInfo<'_> {}
+
+impl tarantool::proc::Return for VersionInfo<'_> {
+    #[inline(always)]
+    fn ret(self, ctx: tarantool::tuple::FunctionCtx) -> std::os::raw::c_int {
+        tarantool::proc::ReturnMsgpack(self).ret(ctx)
+    }
+}
+
+impl VersionInfo<'static> {
+    #[inline(always)]
+    pub fn current() -> Self {
+        Self {
+            picodata_version: PICODATA_VERSION.into(),
+            proc_api_version: PROC_API_VERSION.into(),
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// .proc_version_info
+////////////////////////////////////////////////////////////////////////////////
+
+#[proc]
+pub fn proc_version_info() -> VersionInfo<'static> {
+    VersionInfo::current()
+}
diff --git a/src/lib.rs b/src/lib.rs
index ecfc5eecda..1a386726ea 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,6 +3,7 @@
 #![allow(clippy::let_and_return)]
 #![allow(clippy::needless_return)]
 #![allow(clippy::unwrap_or_default)]
+#![allow(clippy::redundant_static_lifetimes)]
 use serde::{Deserialize, Serialize};
 
 use ::raft::prelude as raft;
@@ -41,6 +42,7 @@ pub mod discovery;
 pub mod error_injection;
 pub mod failure_domain;
 pub mod governor;
+pub mod info;
 pub mod instance;
 pub mod ipc;
 pub mod kvcell;
diff --git a/src/luamod.rs b/src/luamod.rs
index 86cdd25c98..238f4ad49b 100644
--- a/src/luamod.rs
+++ b/src/luamod.rs
@@ -67,7 +67,7 @@ pub(crate) fn setup(args: &args::Run) {
         "},
         {
             const _: () = assert!(str_eq(env!("CARGO_PKG_VERSION"), "23.12.0"));
-            env!("GIT_DESCRIBE")
+            crate::info::PICODATA_VERSION
         },
     );
 
diff --git a/test/int/test_basics.py b/test/int/test_basics.py
index 4b2fc4d13a..281301a481 100644
--- a/test/int/test_basics.py
+++ b/test/int/test_basics.py
@@ -320,3 +320,8 @@ def test_governor_notices_restarts(instance: Instance):
     check_vshard_configured(instance)
 
     assert instance.current_grade() == dict(variant="Online", incarnation=2)
+
+
+def test_proc_version_info(instance: Instance):
+    info = instance.call(".proc_version_info")
+    assert info.keys() == set(["picodata_version", "proc_api_version"])  # type: ignore
-- 
GitLab