From c3b9843349436d285d567d073b56c89695d01c03 Mon Sep 17 00:00:00 2001 From: Martin Tomazic Date: Tue, 23 May 2023 15:17:53 +0200 Subject: [PATCH 1/5] DAC: Add `allow_v1_api` flag to dac node configuration --- src/bin_dac_node/main_dac.ml | 51 ++++++++++++++++++++++++------ src/lib_dac_node/RPC_server.ml | 2 +- src/lib_dac_node/configuration.ml | 18 ++++++----- src/lib_dac_node/configuration.mli | 13 ++++++-- src/lib_dac_node/daemon.ml | 14 ++++++-- 5 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/bin_dac_node/main_dac.ml b/src/bin_dac_node/main_dac.ml index 8b030abb5cc1..24aebfa2eb8b 100644 --- a/src/bin_dac_node/main_dac.ml +++ b/src/bin_dac_node/main_dac.ml @@ -149,6 +149,12 @@ let rpc_port_arg = ~default positive_int_parameter +let allow_v1_api_arg : (bool, Client_context.full) Tezos_clic.arg = + Tezos_clic.switch + ~long:"allow-v1-api" + ~doc:(Format.sprintf "Run dac node with both V0 and V1 (WIP) API.") + () + let raw_rpc_parameter = Tezos_clic.parameter (fun _cctxt h -> match String.split ':' h with @@ -183,10 +189,16 @@ let experimental_disclaimer () = module Config_init = struct let create_configuration ~data_dir ~reveal_data_dir ~rpc_address ~rpc_port - mode (cctxt : Client_context.full) = + ~allow_v1_api mode (cctxt : Client_context.full) = let open Lwt_result_syntax in let config = - Configuration.make ~data_dir ~reveal_data_dir rpc_address rpc_port mode + Configuration.make + ~data_dir + ~reveal_data_dir + ~allow_v1_api + rpc_address + rpc_port + mode in let* () = Configuration.save config in let*! _ = @@ -234,6 +246,8 @@ module Config_init = struct ~reveal_data_dir ~rpc_address ~rpc_port + ~allow_v1_api:false + (* [Legacy] mode exists only as part of the [V0]. *) (Configuration.make_legacy threshold committee_members_addresses @@ -245,7 +259,12 @@ module Config_init = struct command ~group ~desc:"Configure DAC node in coordinator mode." - (args4 data_dir_arg rpc_address_arg rpc_port_arg reveal_data_dir_arg) + (args5 + data_dir_arg + rpc_address_arg + rpc_port_arg + reveal_data_dir_arg + allow_v1_api_arg) (prefixes [ "configure"; @@ -258,7 +277,7 @@ module Config_init = struct "members"; ] @@ seq_of_param @@ tz4_public_key_param) - (fun (data_dir, rpc_address, rpc_port, reveal_data_dir) + (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, allow_v1_api) committee_members cctxt -> experimental_disclaimer () ; @@ -267,6 +286,7 @@ module Config_init = struct ~reveal_data_dir ~rpc_address ~rpc_port + ~allow_v1_api (Configuration.make_coordinator committee_members) cctxt) @@ -275,13 +295,18 @@ module Config_init = struct command ~group ~desc:"Configure DAC node in committee member mode." - (args4 data_dir_arg rpc_address_arg rpc_port_arg reveal_data_dir_arg) + (args5 + data_dir_arg + rpc_address_arg + rpc_port_arg + reveal_data_dir_arg + allow_v1_api_arg) (prefixes ["configure"; "as"; "committee"; "member"; "with"; "coordinator"] @@ coordinator_rpc_param @@ prefixes ["and"; "signer"] @@ tz4_address_param @@ stop) - (fun (data_dir, rpc_address, rpc_port, reveal_data_dir) + (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, allow_v1_api) (coordinator_rpc_address, coordinator_rpc_port) address cctxt -> @@ -291,6 +316,7 @@ module Config_init = struct ~reveal_data_dir ~rpc_address ~rpc_port + ~allow_v1_api (Configuration.make_committee_member coordinator_rpc_address coordinator_rpc_port @@ -302,7 +328,7 @@ module Config_init = struct command ~group ~desc:"Configure DAC node in observer mode." - (args5 + (args6 data_dir_arg rpc_address_arg rpc_port_arg @@ -312,12 +338,18 @@ module Config_init = struct (Format.sprintf "The timeout in seconds for requesting a missing page from \ Committee Member. Defaults to %i seconds." - Configuration.Observer.default_timeout))) + Configuration.Observer.default_timeout)) + allow_v1_api_arg) (prefixes ["configure"; "as"; "observer"; "with"; "coordinator"] @@ coordinator_rpc_param @@ prefixes ["and"; "committee"; "member"; "rpc"; "addresses"] @@ seq_of_param @@ committee_rpc_addresses_param) - (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, timeout) + (fun ( data_dir, + rpc_address, + rpc_port, + reveal_data_dir, + timeout, + allow_v1_api ) (coordinator_rpc_address, coordinator_rpc_port) committee_rpc_addresses cctxt -> @@ -327,6 +359,7 @@ module Config_init = struct ~reveal_data_dir ~rpc_address ~rpc_port + ~allow_v1_api (Configuration.make_observer ~committee_rpc_addresses ?timeout diff --git a/src/lib_dac_node/RPC_server.ml b/src/lib_dac_node/RPC_server.ml index d07c3bed36aa..72fa783ef31a 100644 --- a/src/lib_dac_node/RPC_server.ml +++ b/src/lib_dac_node/RPC_server.ml @@ -259,7 +259,7 @@ module V1 = struct end end -let start ~rpc_address ~rpc_port node_ctxt = +let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = let open Lwt_syntax in let rw_store = Node_context.get_node_store node_ctxt Store_sigs.Read_write in let page_store = Node_context.get_page_store node_ctxt in diff --git a/src/lib_dac_node/configuration.ml b/src/lib_dac_node/configuration.ml index 5673df1b075f..bbbbaa22096a 100644 --- a/src/lib_dac_node/configuration.ml +++ b/src/lib_dac_node/configuration.ml @@ -265,6 +265,7 @@ type t = { mode : mode; (** Configuration parameters specific to the operating mode of the DAC. *) + allow_v1_api : bool; } let mode_name t = @@ -274,8 +275,8 @@ let mode_name t = | Observer _ -> Observer.name | Legacy _ -> Legacy.name -let make ~data_dir ~reveal_data_dir rpc_address rpc_port mode = - {data_dir; reveal_data_dir; rpc_address; rpc_port; mode} +let make ~data_dir ~reveal_data_dir ~allow_v1_api rpc_address rpc_port mode = + {data_dir; reveal_data_dir; rpc_address; rpc_port; mode; allow_v1_api} let data_dir_path config subpath = Filename.concat config.data_dir subpath @@ -320,11 +321,11 @@ let mode_encoding = let encoding : t Data_encoding.t = let open Data_encoding in conv - (fun {data_dir; rpc_address; rpc_port; reveal_data_dir; mode} -> - (data_dir, rpc_address, rpc_port, reveal_data_dir, mode)) - (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, mode) -> - {data_dir; rpc_address; rpc_port; reveal_data_dir; mode}) - (obj5 + (fun {data_dir; rpc_address; rpc_port; reveal_data_dir; mode; allow_v1_api} -> + (data_dir, rpc_address, rpc_port, reveal_data_dir, mode, allow_v1_api)) + (fun (data_dir, rpc_address, rpc_port, reveal_data_dir, mode, allow_v1_api) -> + {data_dir; rpc_address; rpc_port; reveal_data_dir; mode; allow_v1_api}) + (obj6 (dft "data-dir" ~description:"Location of the data dir" @@ -337,7 +338,8 @@ let encoding : t Data_encoding.t = ~description:"Reveal data directory" string default_reveal_data_dir) - (req "mode" ~description:"Running mode" mode_encoding)) + (req "mode" ~description:"Running mode" mode_encoding) + (dft "allow_v1_api" ~description:"Allow V1 API boolean flag" bool false)) type error += DAC_node_unable_to_write_configuration_file of string diff --git a/src/lib_dac_node/configuration.mli b/src/lib_dac_node/configuration.mli index 0d177948dc55..e7aab8057e8f 100644 --- a/src/lib_dac_node/configuration.mli +++ b/src/lib_dac_node/configuration.mli @@ -112,6 +112,7 @@ type t = private { mode : mode; (** Configuration parameters specific to the operating mode of the DAC. *) + allow_v1_api : bool; (** Feature flag for registering [V1] API endpoints.*) } (** [mode_name t] returns a string representation of the operating mode @@ -153,10 +154,16 @@ val make_legacy : Tezos_crypto.Aggregate_signature.public_key_hash option -> mode -(** [make ~data_dir ~reveal_data_dir rpc_address rpc_port mode] creates a - configuration value from the specified parameters. *) +(** [make ~data_dir ~reveal_data_dir ~allow_v1_api rpc_address rpc_port mode] + creates a configuration value from the specified parameters. *) val make : - data_dir:string -> reveal_data_dir:string -> string -> int -> mode -> t + data_dir:string -> + reveal_data_dir:string -> + allow_v1_api:bool -> + string -> + int -> + mode -> + t (** [filename config] gets the path to config file *) val filename : t -> string diff --git a/src/lib_dac_node/daemon.ml b/src/lib_dac_node/daemon.ml index 8ba9dc68a44f..f7e76fa762df 100644 --- a/src/lib_dac_node/daemon.ml +++ b/src/lib_dac_node/daemon.ml @@ -60,8 +60,14 @@ let run ~data_dir cctxt = let open Lwt_result_syntax in let*! () = Event.(emit starting_node) () in let* (Configuration. - {rpc_address; rpc_port; reveal_data_dir; mode = _; data_dir = _} as - config) = + { + rpc_address; + rpc_port; + reveal_data_dir; + mode = _; + data_dir = _; + allow_v1_api; + } as config) = Configuration.load ~data_dir in let operating_mode_string = Configuration.mode_name config in @@ -70,7 +76,9 @@ let run ~data_dir cctxt = let* ctxt = Node_context.init config cctxt in (* TODO: https://gitlab.com/tezos/tezos/-/issues/4725 Stop DAC node when in Legacy mode, if threshold is not reached. *) - let* rpc_server = RPC_server.start ~rpc_address ~rpc_port ctxt in + let* rpc_server = + RPC_server.start ~rpc_address ~rpc_port ~allow_v1_api ctxt + in let _ = RPC_server.install_finalizer rpc_server in let*! () = Event.(emit rpc_server_is_ready (rpc_address, rpc_port)) in (* Start daemon to resolve current protocol plugin *) -- GitLab From 3b4e79b3bf2ff5724f76909df531725d2bac7e3b Mon Sep 17 00:00:00 2001 From: Martin Tomazic Date: Tue, 23 May 2023 15:42:22 +0200 Subject: [PATCH 2/5] DAC/tezt: Add `allow_v1_api` feature flag to `Dac_node` --- tezt/lib_tezos/dac_helper.ml | 22 +++++++++++++------ tezt/lib_tezos/dac_helper.mli | 4 ++++ tezt/lib_tezos/dac_node.ml | 41 +++++++++++++++++++++-------------- tezt/lib_tezos/dac_node.mli | 6 +++++ 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/tezt/lib_tezos/dac_helper.ml b/tezt/lib_tezos/dac_helper.ml index 04310d84825c..2d893ea28395 100644 --- a/tezt/lib_tezos/dac_helper.ml +++ b/tezt/lib_tezos/dac_helper.ml @@ -157,7 +157,8 @@ let with_legacy_dac_node ?name ?sc_rollup_node ?(pvm_name = "arith") f dac_node committee_members let with_coordinator_node ?name ?sc_rollup_node ?(pvm_name = "arith") - ?(wait_ready = true) ~committee_members tezos_node tezos_client f = + ?(wait_ready = true) ?(allow_v1_api = false) ~committee_members tezos_node + tezos_client f = let reveal_data_dir = Option.map (fun sc_rollup_node -> @@ -170,6 +171,7 @@ let with_coordinator_node ?name ?sc_rollup_node ?(pvm_name = "arith") ~node:tezos_node ~client:tezos_client ?reveal_data_dir + ~allow_v1_api ~committee_members: (List.map (fun (dc : Account.aggregate_key) -> dc.aggregate_public_key) @@ -181,8 +183,8 @@ let with_coordinator_node ?name ?sc_rollup_node ?(pvm_name = "arith") f dac_node committee_members let with_committee_member ?name ?sc_rollup_node ?(pvm_name = "arith") - ?(wait_ready = true) ~committee_member tezos_node coordinator_node - tezos_client f = + ?(wait_ready = true) ?(allow_v1_api = false) ~committee_member tezos_node + coordinator_node tezos_client f = let reveal_data_dir = Option.map (fun sc_rollup_node -> @@ -198,6 +200,7 @@ let with_committee_member ?name ?sc_rollup_node ?(pvm_name = "arith") ?reveal_data_dir ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~allow_v1_api ~address:public_key_hash () in @@ -206,8 +209,8 @@ let with_committee_member ?name ?sc_rollup_node ?(pvm_name = "arith") f dac_node committee_member let with_observer ?name ?sc_rollup_node ?(pvm_name = "arith") - ?(wait_ready = true) ~committee_member_rpcs tezos_node coordinator_node - tezos_client f = + ?(wait_ready = true) ?(allow_v1_api = false) ~committee_member_rpcs + tezos_node coordinator_node tezos_client f = let reveal_data_dir = Option.map (fun sc_rollup_node -> @@ -222,6 +225,7 @@ let with_observer ?name ?sc_rollup_node ?(pvm_name = "arith") ?reveal_data_dir ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) + ~allow_v1_api ~committee_member_rpcs () in @@ -257,8 +261,9 @@ let with_fresh_rollup ?(pvm_name = "arith") ~protocol tezos_node tezos_client let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ?(pvm_name = "arith") ?(custom_committee_members = []) ?commitment_period - ?challenge_window ?event_sections_levels ?node_arguments ~__FILE__ - ~committee_size ~observers variant scenario = + ?challenge_window ?event_sections_levels ?node_arguments + ?(allow_v1_api = false) ~__FILE__ ~committee_size ~observers variant + scenario = let description = "Testing Full DAC infrastructure" in test ~__FILE__ @@ -307,6 +312,7 @@ let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ~name:"coordinator" ~pvm_name ~committee_members + ~allow_v1_api @@ fun coordinator_node committee_members -> let committee_members_nodes = List.mapi @@ -318,6 +324,7 @@ let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) ~address:aggregate_public_key_hash + ~allow_v1_api ()) committee_members in @@ -354,6 +361,7 @@ let scenario_with_full_dac_infrastructure ?(tags = ["dac"; "full"]) ~coordinator_rpc_host:(Dac_node.rpc_host coordinator_node) ~coordinator_rpc_port:(Dac_node.rpc_port coordinator_node) ~committee_member_rpcs + ~allow_v1_api () in (rollup_node_i, dac_node_i)) diff --git a/tezt/lib_tezos/dac_helper.mli b/tezt/lib_tezos/dac_helper.mli index 307ff5551433..2aa8484b7bcc 100644 --- a/tezt/lib_tezos/dac_helper.mli +++ b/tezt/lib_tezos/dac_helper.mli @@ -69,6 +69,7 @@ val with_coordinator_node : ?sc_rollup_node:Sc_rollup_node.t -> ?pvm_name:string -> ?wait_ready:bool -> + ?allow_v1_api:bool -> committee_members:Account.aggregate_key list -> Node.t -> Client.t -> @@ -82,6 +83,7 @@ val with_committee_member : ?sc_rollup_node:Sc_rollup_node.t -> ?pvm_name:string -> ?wait_ready:bool -> + ?allow_v1_api:bool -> committee_member:Account.key -> Node.t -> Dac_node.t -> @@ -95,6 +97,7 @@ val with_observer : ?sc_rollup_node:Sc_rollup_node.t -> ?pvm_name:string -> ?wait_ready:bool -> + ?allow_v1_api:bool -> committee_member_rpcs:(string * int) list -> Node.t -> Dac_node.t -> @@ -125,6 +128,7 @@ val scenario_with_full_dac_infrastructure : ?challenge_window:int -> ?event_sections_levels:(string * Daemon.Level.level) list -> ?node_arguments:Node.argument list -> + ?allow_v1_api:bool -> __FILE__:string -> committee_size:int -> observers:int -> diff --git a/tezt/lib_tezos/dac_node.ml b/tezt/lib_tezos/dac_node.ml index 77765c6fefed..f114fced9927 100644 --- a/tezt/lib_tezos/dac_node.ml +++ b/tezt/lib_tezos/dac_node.ml @@ -61,6 +61,7 @@ module Parameters = struct node : Node.t; client : Client.t; mutable pending_ready : unit option Lwt.u list; + allow_v1_api : bool; } type session_state = {mutable ready : bool} @@ -110,6 +111,8 @@ let data_dir dac_node = dac_node.persistent_state.data_dir let reveal_data_dir dac_node = dac_node.persistent_state.reveal_data_dir +let allow_v1_api dac_node = dac_node.persistent_state.allow_v1_api + let spawn_command dac_node = Process.spawn ~name:dac_node.name ~color:dac_node.color dac_node.path @@ -119,16 +122,18 @@ let localhost = "127.0.0.1" let spawn_config_init dac_node = let arg_command = - [ - "--data-dir"; - data_dir dac_node; - "--rpc-port"; - string_of_int (rpc_port dac_node); - "--rpc-addr"; - rpc_host dac_node; - "--reveal-data-dir"; - reveal_data_dir dac_node; - ] + List.append + [ + "--data-dir"; + data_dir dac_node; + "--rpc-port"; + string_of_int (rpc_port dac_node); + "--rpc-addr"; + rpc_host dac_node; + "--reveal-data-dir"; + reveal_data_dir dac_node; + ] + @@ if allow_v1_api dac_node then ["--allow-v1-api"] else [] in let mode_command = match dac_node.persistent_state.mode with @@ -282,8 +287,8 @@ let handle_event dac_node {name; value = _; timestamp = _} = match name with "dac_node_is_ready.v0" -> set_ready dac_node | _ -> () let create ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe - ?(rpc_host = "127.0.0.1") ?rpc_port ?reveal_data_dir ~mode ~node ~client () - = + ?(rpc_host = "127.0.0.1") ?rpc_port ?reveal_data_dir ~mode ~node ~client + ?(allow_v1_api = false) () = let name = match name with None -> fresh_name () | Some name -> name in let data_dir = match data_dir with None -> Temp.dir name | Some dir -> dir @@ -311,6 +316,7 @@ let create ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe pending_ready = []; node; client; + allow_v1_api; } in on_event dac_node (handle_event dac_node) ; @@ -343,7 +349,7 @@ let create_legacy ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe let create_coordinator ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe ?(rpc_host = "127.0.0.1") ?rpc_port ?reveal_data_dir - ~committee_members ~node ~client () = + ?(allow_v1_api = false) ~committee_members ~node ~client () = let mode = Coordinator {committee_members} in create ~path @@ -357,12 +363,13 @@ let create_coordinator ?(path = Constant.dac_node) ?name ?color ?data_dir ~mode ~node ~client + ~allow_v1_api () let create_committee_member ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe ?(rpc_host = localhost) ?rpc_port ?reveal_data_dir - ?(coordinator_rpc_host = localhost) ?coordinator_rpc_port ~address ~node - ~client () = + ?(coordinator_rpc_host = localhost) ?coordinator_rpc_port + ?(allow_v1_api = false) ~address ~node ~client () = let coordinator_rpc_port = match coordinator_rpc_port with None -> Port.fresh () | Some port -> port in @@ -381,12 +388,13 @@ let create_committee_member ?(path = Constant.dac_node) ?name ?color ?data_dir ~mode ~node ~client + ~allow_v1_api () let create_observer ?(path = Constant.dac_node) ?name ?color ?data_dir ?event_pipe ?(rpc_host = localhost) ?rpc_port ?reveal_data_dir ?(coordinator_rpc_host = localhost) ?coordinator_rpc_port ?timeout - ~committee_member_rpcs ~node ~client () = + ?(allow_v1_api = false) ~committee_member_rpcs ~node ~client () = let coordinator_rpc_port = match coordinator_rpc_port with None -> Port.fresh () | Some port -> port in @@ -411,6 +419,7 @@ let create_observer ?(path = Constant.dac_node) ?name ?color ?data_dir ~mode ~node ~client + ~allow_v1_api () let make_arguments node = diff --git a/tezt/lib_tezos/dac_node.mli b/tezt/lib_tezos/dac_node.mli index 27096e25cd45..36cee8d47f73 100644 --- a/tezt/lib_tezos/dac_node.mli +++ b/tezt/lib_tezos/dac_node.mli @@ -59,6 +59,7 @@ val create_coordinator : ?rpc_host:string -> ?rpc_port:int -> ?reveal_data_dir:string -> + ?allow_v1_api:bool -> committee_members:string list -> node:Node.t -> client:Client.t -> @@ -78,6 +79,7 @@ val create_committee_member : ?reveal_data_dir:string -> ?coordinator_rpc_host:string -> ?coordinator_rpc_port:int -> + ?allow_v1_api:bool -> address:string -> node:Node.t -> client:Client.t -> @@ -99,6 +101,7 @@ val create_observer : ?coordinator_rpc_host:string -> ?coordinator_rpc_port:int -> ?timeout:int -> + ?allow_v1_api:bool -> committee_member_rpcs:(string * int) list -> node:Node.t -> client:Client.t -> @@ -127,6 +130,9 @@ val data_dir : t -> string (** Get the reveal-data-dir of an dac node. *) val reveal_data_dir : t -> string +(** [allow_v1_api dac_node] is [true] if current node allows running [V1] API. *) +val allow_v1_api : t -> bool + (** Calls [ls] on reveal data dir. *) val ls_reveal_data_dir : t -> string list Lwt.t -- GitLab From beca3dd8a66c2c550cd62877e1a1e7936b82b1d5 Mon Sep 17 00:00:00 2001 From: Martin Tomazic Date: Tue, 23 May 2023 15:59:25 +0200 Subject: [PATCH 3/5] DAC: Decouple `V0` and `V1` dynamic rpc directory registration --- src/lib_dac_node/RPC_server.ml | 44 +++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/lib_dac_node/RPC_server.ml b/src/lib_dac_node/RPC_server.ml index 72fa783ef31a..2f0e1d3560a4 100644 --- a/src/lib_dac_node/RPC_server.ml +++ b/src/lib_dac_node/RPC_server.ml @@ -264,28 +264,22 @@ let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = let rw_store = Node_context.get_node_store node_ctxt Store_sigs.Read_write in let page_store = Node_context.get_page_store node_ctxt in let cctxt = Node_context.get_tezos_node_cctxt node_ctxt in - let register_dynamic_rpc dac_plugin = + let register_v0_dynamic_rpc dac_plugin = match Node_context.get_mode node_ctxt with | Coordinator coordinator_node_ctxt -> - Tezos_rpc.Directory.merge - (V0.Coordinator.dynamic_rpc_dir - dac_plugin - rw_store - page_store - coordinator_node_ctxt) - (V1.Coordinator.dynamic_rpc_dir dac_plugin page_store) + V0.Coordinator.dynamic_rpc_dir + dac_plugin + rw_store + page_store + coordinator_node_ctxt | Committee_member _committee_member_node_ctxt -> - Tezos_rpc.Directory.merge - (V0.Committee_member.dynamic_rpc_dir dac_plugin page_store) - (V1.Committee_member.dynamic_rpc_dir dac_plugin page_store) + V0.Committee_member.dynamic_rpc_dir dac_plugin page_store | Observer {committee_cctxts; timeout; _} -> - Tezos_rpc.Directory.merge - (V0.Observer.dynamic_rpc_dir - dac_plugin - committee_cctxts - (Float.of_int timeout) - page_store) - (V1.Observer.dynamic_rpc_dir dac_plugin page_store) + V0.Observer.dynamic_rpc_dir + dac_plugin + committee_cctxts + (Float.of_int timeout) + page_store | Legacy legacy_node_ctxt -> V0.Legacy.dynamic_rpc_dir dac_plugin @@ -294,6 +288,16 @@ let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = cctxt legacy_node_ctxt in + let register_v1_dynamic_rpc dac_plugin = + match Node_context.get_mode node_ctxt with + | Coordinator _coordinator_node_ctxt -> + V1.Coordinator.dynamic_rpc_dir dac_plugin page_store + | Committee_member _committee_member_node_ctxt -> + V1.Committee_member.dynamic_rpc_dir dac_plugin page_store + | Observer _observer_ctxt -> + V1.Observer.dynamic_rpc_dir dac_plugin page_store + | Legacy _legacy_node_ctxt -> Tezos_rpc.Directory.empty + in let register_health_endpoints dir = dir |> register_get_health_ready node_ctxt @@ -307,7 +311,9 @@ let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = match Node_context.get_status node_ctxt with | Ready {dac_plugin = (module Dac_plugin)} -> Lwt.return - (register_dynamic_rpc (module Dac_plugin) + (Tezos_rpc.Directory.merge + (register_v0_dynamic_rpc (module Dac_plugin)) + (register_v1_dynamic_rpc (module Dac_plugin)) |> register_health_endpoints) | Starting -> Lwt.return (Tezos_rpc.Directory.empty |> register_health_endpoints)) -- GitLab From dcaadbd352d73df18eff14f9eb57d55460df560d Mon Sep 17 00:00:00 2001 From: Martin Tomazic Date: Tue, 23 May 2023 16:08:00 +0200 Subject: [PATCH 4/5] DAC: Register `V1` API only if `allow_v1_api` is set --- src/lib_dac_node/RPC_server.ml | 6 ++++-- tezt/tests/dac.ml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib_dac_node/RPC_server.ml b/src/lib_dac_node/RPC_server.ml index 2f0e1d3560a4..8361e24d3699 100644 --- a/src/lib_dac_node/RPC_server.ml +++ b/src/lib_dac_node/RPC_server.ml @@ -259,7 +259,7 @@ module V1 = struct end end -let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = +let start ~rpc_address ~rpc_port ~allow_v1_api node_ctxt = let open Lwt_syntax in let rw_store = Node_context.get_node_store node_ctxt Store_sigs.Read_write in let page_store = Node_context.get_page_store node_ctxt in @@ -313,7 +313,9 @@ let start ~rpc_address ~rpc_port ~allow_v1_api:_ node_ctxt = Lwt.return (Tezos_rpc.Directory.merge (register_v0_dynamic_rpc (module Dac_plugin)) - (register_v1_dynamic_rpc (module Dac_plugin)) + (if allow_v1_api then + register_v1_dynamic_rpc (module Dac_plugin) + else Tezos_rpc.Directory.empty) |> register_health_endpoints) | Starting -> Lwt.return (Tezos_rpc.Directory.empty |> register_health_endpoints)) diff --git a/tezt/tests/dac.ml b/tezt/tests/dac.ml index dbf11be05ade..466d02b55073 100644 --- a/tezt/tests/dac.ml +++ b/tezt/tests/dac.ml @@ -2896,6 +2896,7 @@ let register ~protocols = Tx_kernel_e2e.test_tx_kernel_e2e_with_dac_observer_synced_with_dac protocols ; Tx_kernel_e2e.test_tx_kernel_e2e_with_dac_observer_missing_pages protocols ; scenario_with_full_dac_infrastructure + ~allow_v1_api:true ~__FILE__ ~observers:0 ~committee_size:0 -- GitLab From e360f8f370334ca3e64ef3ce5c28a0f6b850f1f1 Mon Sep 17 00:00:00 2001 From: Martin Tomazic Date: Fri, 26 May 2023 11:28:41 +0200 Subject: [PATCH 5/5] DAC/tezt: Test `--allow-v1-api` feature flag --- tezt/tests/dac.ml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tezt/tests/dac.ml b/tezt/tests/dac.ml index 466d02b55073..b23bd6528130 100644 --- a/tezt/tests/dac.ml +++ b/tezt/tests/dac.ml @@ -2752,6 +2752,29 @@ module V1_API = struct in let actual = remove_preamble (decode_hex_string_to_bytes raw) in return @@ check_preimage payload actual + + (** [test_allow_v1_feature_flag] tests [--allow-v1-api] feature flag. *) + let test_allow_v1_feature_flag Scenarios.{coordinator_node; _} = + (* Running [Coordinator] node without explicitly providing [--allow-v1-api] + feature flag should not register [V1] API. Calling [V1] API endpoints + should therefore result in 404 (Not found) errors. To test this: + + 1. We post payload to [coordinator_node] to obtain valid [root_hash] + 2. Calling "GET v1/pages/[root_hash]" should fail with 404 response, + because [--allow-v1-api] feature flag was not set. + *) + let* root_hash = + (* TODO https://gitlab.com/tezos/tezos/-/issues/5671 + Once we have "PUT v1/preimage" we should use a call to [V1] api here + instead. *) + RPC.call + coordinator_node + (Dac_rpc.V0.Coordinator.post_preimage ~payload:"test") + in + let* response = + RPC.call_raw coordinator_node @@ Dac_rpc.V1.get_pages root_hash + in + return @@ RPC.check_string_response ~code:404 response end let register ~protocols = @@ -2903,4 +2926,13 @@ let register ~protocols = ~tags:["dac"; "dac_node"] "test v1/get_pages" V1_API.test_get_pages + protocols ; + scenario_with_full_dac_infrastructure + ~allow_v1_api:false + ~__FILE__ + ~observers:0 + ~committee_size:0 + ~tags:["dac"; "dac_node"] + "test --allow_v1_api feature flag" + V1_API.test_allow_v1_feature_flag protocols -- GitLab