diff --git a/docs/doc_gen/rpc_doc.ml b/docs/doc_gen/rpc_doc.ml index e354f25604d7cefc91ae95ebea8ad4d558f2fbf1..c859b191fa74d2b0c81567382c47ec3230434f76 100644 --- a/docs/doc_gen/rpc_doc.ml +++ b/docs/doc_gen/rpc_doc.ml @@ -353,7 +353,6 @@ let pp_document ppf _name intro prefix rpc_dir version = let make_index_shell ?introduction_path node = let open Lwt_syntax in let* shell_dir = - let version = Tezos_version_value.Current_git_info.version in let commit_info = ({ commit_hash = Tezos_version_value.Current_git_info.commit_hash; @@ -361,7 +360,8 @@ let make_index_shell ?introduction_path node = } : Tezos_version.Node_version.commit_info) in - let shell_dir = Node.build_rpc_directory ~version ~commit_info node in + let node_version = Node.get_version node in + let shell_dir = Node.build_rpc_directory ~node_version ~commit_info node in let shell_dir = Tezos_rpc.Directory.register0 shell_dir diff --git a/manifest/main.ml b/manifest/main.ml index 614035a5777a02795850ce00f03dc1a633cc9e4f..e56ac0c24d51cac3c37a1bb2f9b8b324c4f1db00 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -4393,6 +4393,7 @@ let octez_rpc_process = ~deps: [ octez_base |> open_ ~m:"TzPervasives" |> open_; + octez_shell |> open_; octez_base_unix |> open_; octez_node_config |> open_; octez_rpc_http |> open_; diff --git a/opam/octez-rpc-process.opam b/opam/octez-rpc-process.opam index 79395fd64d9cd08fb6c2f90bf0f23f5cd6b3870d..71d8a1648b102cf2cf12e43ecee42235511c160c 100644 --- a/opam/octez-rpc-process.opam +++ b/opam/octez-rpc-process.opam @@ -11,6 +11,7 @@ depends: [ "dune" { >= "3.0" & < "3.11" } "ocaml" { >= "4.14" } "octez-libs" + "octez-shell-libs" "octez-node-config" "lwt" { >= "5.7.0" } "lwt-exit" diff --git a/src/bin_node/node_run_command.ml b/src/bin_node/node_run_command.ml index 9714a96b6cb4c18f52953a28bc00a23ae366ac25..660c16b54c0ea648076fd91be4d55abf7b688aeb 100644 --- a/src/bin_node/node_run_command.ml +++ b/src/bin_node/node_run_command.ml @@ -377,27 +377,12 @@ module Metrics_server = Prometheus_app.Cohttp (Cohttp_lwt_unix.Server) (* Launches an RPC server depending on the given [mode] (which is usually TCP, TLS or unix sockets). *) -let launch_rpc_server ~mode (config : Config_file.t) node (addr, port) = +let launch_rpc_server ~mode (config : Config_file.t) dir (addr, port) = let open Lwt_result_syntax in let rpc_config = config.rpc in let media_types = rpc_config.media_type in let*! acl_policy = RPC_server.Acl.resolve_domain_names rpc_config.acl in let host = Ipaddr.V6.to_string addr in - let version = Tezos_version_value.Current_git_info.version in - let commit_info = - ({ - commit_hash = Tezos_version_value.Current_git_info.commit_hash; - commit_date = Tezos_version_value.Current_git_info.committer_date; - } - : Tezos_version.Node_version.commit_info) - in - let dir = Node.build_rpc_directory ~version ~commit_info node in - let dir = Node_directory.build_node_directory config dir in - let dir = - Tezos_rpc.Directory.register_describe_directory_service - dir - Tezos_rpc.Service.description_service - in let acl = let open RPC_server.Acl in find_policy acl_policy (Ipaddr.V6.to_string addr, Some port) @@ -467,7 +452,7 @@ type rpc_server_kind = | No_server (* Initializes an RPC server handled by the node main process. *) -let init_local_rpc_server (config : Config_file.t) node = +let init_local_rpc_server (config : Config_file.t) dir = let open Lwt_result_syntax in let* servers = List.concat_map_es @@ -489,7 +474,7 @@ let init_local_rpc_server (config : Config_file.t) node = `No_password, `Port port ) in - launch_rpc_server ~mode config node addr) + launch_rpc_server ~mode config dir addr) addrs) config.rpc.local_listen_addrs in @@ -502,7 +487,7 @@ let rpc_socket_path ~socket_dir ~id ~pid = (* Initializes an RPC server handled by the node process. It will be used by an external RPC process, identified by [id], to forward RPCs to the node through a Unix socket. *) -let init_local_rpc_server_for_external_process id (config : Config_file.t) node +let init_local_rpc_server_for_external_process id (config : Config_file.t) dir addr = let open Lwt_result_syntax in let socket_dir = Tezos_base_unix.Socket.get_temporary_socket_dir () in @@ -517,10 +502,10 @@ let init_local_rpc_server_for_external_process id (config : Config_file.t) node Lwt_exit.register_clean_up_callback ~loc:__LOC__ (fun _ -> Lwt_unix.unlink comm_socket_path) in - let* rpc_server = launch_rpc_server ~mode config node addr in + let* rpc_server = launch_rpc_server ~mode config dir addr in return (rpc_server, comm_socket_path) -let init_external_rpc_server config node internal_events = +let init_external_rpc_server config node_version dir internal_events = let open Lwt_result_syntax in (* Start one rpc_process for each rpc endpoint. *) let id = ref 0 in @@ -542,7 +527,7 @@ let init_external_rpc_server config node internal_events = init_local_rpc_server_for_external_process id config - node + dir p2p_point in let addr = P2p_point.Id.to_string p2p_point in @@ -556,6 +541,7 @@ let init_external_rpc_server config node internal_events = Octez_rpc_process.Rpc_process_worker.create ~comm_socket_path config + node_version internal_events in let* () = @@ -604,13 +590,30 @@ let init_zcash () = "Failed to initialize Zcash parameters: %s" (Printexc.to_string exn)) -let init_rpc (config : Config_file.t) node internal_events = +let init_rpc (config : Config_file.t) (node : Node.t) internal_events = let open Lwt_result_syntax in (* Start local RPC server (handled by the node main process) only when at least one local listen addr is given. *) + let commit_info = + ({ + commit_hash = Tezos_version_value.Current_git_info.commit_hash; + commit_date = Tezos_version_value.Current_git_info.committer_date; + } + : Tezos_version.Node_version.commit_info) + in + let node_version = Node.get_version node in + + let dir = Node.build_rpc_directory ~node_version ~commit_info node in + let dir = Node_directory.build_node_directory config dir in + let dir = + Tezos_rpc.Directory.register_describe_directory_service + dir + Tezos_rpc.Service.description_service + in + let* local_rpc_server = if config.rpc.local_listen_addrs = [] then return No_server - else init_local_rpc_server config node + else init_local_rpc_server config dir in (* Start RPC process only when at least one listen addr is given. *) let* rpc_server = @@ -619,7 +622,7 @@ let init_rpc (config : Config_file.t) node internal_events = (* Starts the node's local RPC server that aims to handle the RPCs forwarded by the rpc_process, if they cannot be processed by the rpc_process itself. *) - init_external_rpc_server config node internal_events + init_external_rpc_server config node_version dir internal_events in return (local_rpc_server :: [rpc_server]) diff --git a/src/lib_rpc_process/directory.ml b/src/lib_rpc_process/directory.ml new file mode 100644 index 0000000000000000000000000000000000000000..204d51d062e30e6f47112cd35bbf07e88a727a4a --- /dev/null +++ b/src/lib_rpc_process/directory.ml @@ -0,0 +1,9 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2023 Nomadic Labs. *) +(* *) +(*****************************************************************************) + +let build_rpc_directory node_version = + Tezos_shell.Version_directory.rpc_directory node_version diff --git a/src/lib_rpc_process/directory.mli b/src/lib_rpc_process/directory.mli new file mode 100644 index 0000000000000000000000000000000000000000..6d11b76ba4292edb8fe89abc2023b1b3a80b2eb8 --- /dev/null +++ b/src/lib_rpc_process/directory.mli @@ -0,0 +1,12 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2023 Nomadic Labs. *) +(* *) +(*****************************************************************************) + +(** [build_rpc_directory ~node_version] builds the Tezos RPC directory for the + rpc process. RPCs handled here are not forwarded to the node. +*) +val build_rpc_directory : + Tezos_version.Node_version.t -> unit Tezos_rpc.Directory.t diff --git a/src/lib_rpc_process/dune b/src/lib_rpc_process/dune index 76eebe9e388d0dcb04c5a5cca0e995272dd3732b..7cf83b04e7255fded5e9e586649c3c574efd5153 100644 --- a/src/lib_rpc_process/dune +++ b/src/lib_rpc_process/dune @@ -7,6 +7,7 @@ (instrumentation (backend bisect_ppx)) (libraries octez-libs.base + octez-shell-libs.shell octez-libs.base.unix octez-node-config octez-libs.rpc-http @@ -18,6 +19,7 @@ (:standard) -open Tezos_base.TzPervasives -open Tezos_base + -open Tezos_shell -open Tezos_base_unix -open Octez_node_config -open Tezos_rpc_http diff --git a/src/lib_rpc_process/main.ml b/src/lib_rpc_process/main.ml index acc982adef5f5984e20a79d9ebbc287bc4616e0f..7623911c2f8c4bc61308235ad2f45eb46bf50fde 100644 --- a/src/lib_rpc_process/main.ml +++ b/src/lib_rpc_process/main.ml @@ -96,7 +96,7 @@ let launch_rpc_server (config : Parameters.t) (addr, port) = allowed_headers = cors_headers; } in - let dir = Tezos_rpc.Directory.empty in + let dir = Directory.build_rpc_directory config.node_version in let server = RPC_server.init_server ~cors diff --git a/src/lib_rpc_process/parameters.ml b/src/lib_rpc_process/parameters.ml index 32ab4ac82f4dea9f7c9ec7e73c070ebab626058c..fe24e9eaf28fab76a6e5a0cd52b643cebadd2465 100644 --- a/src/lib_rpc_process/parameters.ml +++ b/src/lib_rpc_process/parameters.ml @@ -27,16 +27,18 @@ type t = { rpc : Config_file.rpc; rpc_comm_socket_path : string; internal_events : Tezos_base.Internal_event_config.t; + node_version : Tezos_version.Node_version.t; } let parameters_encoding = let open Data_encoding in conv - (fun {rpc; rpc_comm_socket_path; internal_events} -> - (rpc, rpc_comm_socket_path, internal_events)) - (fun (rpc, rpc_comm_socket_path, internal_events) -> - {rpc; rpc_comm_socket_path; internal_events}) - (obj3 + (fun {rpc; rpc_comm_socket_path; internal_events; node_version} -> + (rpc, rpc_comm_socket_path, internal_events, node_version)) + (fun (rpc, rpc_comm_socket_path, internal_events, node_version) -> + {rpc; rpc_comm_socket_path; internal_events; node_version}) + (obj4 (req "rpc" Config_file.rpc_encoding) (req "rpc_comm_socket_path" Data_encoding.string) - (req "internal_events" Tezos_base.Internal_event_config.encoding)) + (req "internal_events" Tezos_base.Internal_event_config.encoding) + (req "node_version" Tezos_version.Node_version.encoding)) diff --git a/src/lib_rpc_process/parameters.mli b/src/lib_rpc_process/parameters.mli index a4b44c802c12aa139924b80684d17cfd3d2e3470..4c57506544c33ec2b45777a4a535a9e84da30293 100644 --- a/src/lib_rpc_process/parameters.mli +++ b/src/lib_rpc_process/parameters.mli @@ -28,6 +28,7 @@ type t = { rpc : Config_file.rpc; rpc_comm_socket_path : string; internal_events : Tezos_base.Internal_event_config.t; + node_version : Tezos_version.Node_version.t; } (** Encoding for parameters type {!t} *) diff --git a/src/lib_rpc_process/rpc_process_worker.ml b/src/lib_rpc_process/rpc_process_worker.ml index 37c4745f30f845e1f5bccc95e728c3a6aa40d93b..83088174100f325105114445b745b51845eb0ea1 100644 --- a/src/lib_rpc_process/rpc_process_worker.ml +++ b/src/lib_rpc_process/rpc_process_worker.ml @@ -117,7 +117,8 @@ type t = { external_process_parameters : Parameters.t; } -let create ~comm_socket_path (config : Config_file.t) events_config = +let create ~comm_socket_path (config : Config_file.t) node_version events_config + = let stop, stopper = Lwt.wait () in { server = None; @@ -128,6 +129,7 @@ let create ~comm_socket_path (config : Config_file.t) events_config = internal_events = events_config; rpc = config.rpc; rpc_comm_socket_path = comm_socket_path; + node_version; }; } diff --git a/src/lib_rpc_process/rpc_process_worker.mli b/src/lib_rpc_process/rpc_process_worker.mli index 4f8159f8cf70fc2c226f19a9e1ece30502d7fb7c..8b3249334f227baca4e50963c98d37a9796fcb41 100644 --- a/src/lib_rpc_process/rpc_process_worker.mli +++ b/src/lib_rpc_process/rpc_process_worker.mli @@ -32,14 +32,19 @@ (** Type of the RPC process worker*) type t -(** [create ~comm_socket_path config internal_event_config] creates the - worker initial state. [comm_socket_path] is a socket path that - will be used to communicate with the node (note that the socket is - created automatically, but the cleaning of it is not - handled). [config] contains all the RPC server configuration (such - as ACLs, cors_headers, …). *) +(** [create ~comm_socket_path config node_version internal_event_config] creates + the worker initial state. [comm_socket_path] is a socket path that will be + used to communicate with the node (note that the socket is created + automatically, but the cleaning of it is not handled). [config] contains all + the RPC server configuration (such as ACLs, cors_headers, …). [node_version] + contains informations regarding version of the node to show when answering + related rpcs. *) val create : - comm_socket_path:string -> Config_file.t -> Internal_event_config.t -> t + comm_socket_path:string -> + Config_file.t -> + Tezos_version.Node_version.t -> + Internal_event_config.t -> + t (** Starts the external RPC process using fork+exec calls. It implements a watch dog that is responsible of restarting the diff --git a/src/lib_shell/node.ml b/src/lib_shell/node.ml index e624d38079409ffbf4d5602cf1152a57f935908d..c28747d6edcaa0910a1ceeb4e037d4a5e75b25e8 100644 --- a/src/lib_shell/node.ml +++ b/src/lib_shell/node.ml @@ -74,6 +74,19 @@ type t = { shutdown : unit -> unit Lwt.t; } +let get_version node = + let commit_info = + ({ + commit_hash = Tezos_version_value.Current_git_info.commit_hash; + commit_date = Tezos_version_value.Current_git_info.committer_date; + } + : Tezos_version.Node_version.commit_info) + in + let version = Tezos_version_value.Current_git_info.version in + let network_version = P2p.announced_version node.p2p in + Tezos_version.Node_version. + {version; commit_info = Some commit_info; network_version} + let peer_metadata_cfg : _ P2p_params.peer_meta_config = { peer_meta_encoding = Peer_metadata.encoding; @@ -351,7 +364,7 @@ let create ?(sandboxed = false) ?sandbox_parameters ~singleprocess ~version let shutdown node = node.shutdown () -let build_rpc_directory ~version ~commit_info node = +let build_rpc_directory ~node_version ~commit_info node = let dir : unit Tezos_rpc.Directory.t ref = ref Tezos_rpc.Directory.empty in let merge d = dir := Tezos_rpc.Directory.merge !dir d in let register0 s f = @@ -378,7 +391,7 @@ let build_rpc_directory ~version ~commit_info node = ~dal_config:node.dal_config ~mainchain_validator:node.mainchain_validator node.store) ; - merge (Version_directory.rpc_directory ~version ~commit_info node.p2p) ; + merge (Version_directory.rpc_directory node_version) ; register0 Tezos_rpc.Service.error_service (fun () () -> Lwt.return_ok (Data_encoding.Json.schema Error_monad.error_encoding)) ; !dir diff --git a/src/lib_shell/node.mli b/src/lib_shell/node.mli index 9f154100514b2f68d7cb1544f62b7369ce0fb021..0bb0a889c6ba3425b8b834b79d9d38127456d014 100644 --- a/src/lib_shell/node.mli +++ b/src/lib_shell/node.mli @@ -26,6 +26,8 @@ type t +val get_version : t -> Tezos_version.Node_version.t + type config = { genesis : Genesis.t; chain_name : Distributed_db_version.Name.t; @@ -67,8 +69,12 @@ val create : val shutdown : t -> unit Lwt.t +(** [build_rpc_directory ~node_version ~commit_info node] builds a Tezos RPC + directory for the node by gathering all the subdirectories. [node_version], + [commit_info] and [node] contain all informations required to build such a + directory. *) val build_rpc_directory : - version:Tezos_version_parser.t -> + node_version:Tezos_version.Node_version.t -> commit_info:Node_version.commit_info -> t -> unit Tezos_rpc.Directory.t diff --git a/src/lib_shell/version_directory.ml b/src/lib_shell/version_directory.ml index e7ffe38d93f9d02a5cbe2122fcafec866f9145e8..12598b4bb02d268f25be143a62040b7f888004af 100644 --- a/src/lib_shell/version_directory.ml +++ b/src/lib_shell/version_directory.ml @@ -22,13 +22,9 @@ (* *) (*****************************************************************************) -let rpc_directory ~version ~(commit_info : Node_version.commit_info) net = +let rpc_directory (node_version : Node_version.t) = let dir = Tezos_rpc.Directory.empty in - let network_version = P2p.announced_version net in Tezos_rpc.Directory.gen_register dir Version_services.S.version - (fun () () () -> - Tezos_rpc.Answer.return - @@ ({version; network_version; commit_info = Some commit_info} - : Node_version.t)) + (fun () () () -> Tezos_rpc.Answer.return @@ (node_version : Node_version.t))