From 8ac435cac62f20a9c8bfa2d1671332843af66c33 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Fri, 4 Apr 2025 20:00:39 -0500 Subject: T7321: add load config operation: load to proposed config --- data/vyconf.proto | 1 + src/session.ml | 7 +++++++ src/session.mli | 2 ++ src/vyconf_pbt.ml | 6 ++++++ src/vyconf_pbt.mli | 1 + src/vyconfd.ml | 9 +++++++++ 6 files changed, 26 insertions(+) diff --git a/data/vyconf.proto b/data/vyconf.proto index 15e10ae..5fc9f76 100644 --- a/data/vyconf.proto +++ b/data/vyconf.proto @@ -148,6 +148,7 @@ message Request { Validate validate = 21; Teardown teardown = 22; ReloadReftree reload_reftree = 23; + Load load = 24; } } diff --git a/src/session.ml b/src/session.ml index 8aeffb3..1843682 100644 --- a/src/session.ml +++ b/src/session.ml @@ -107,6 +107,13 @@ let delete w s path = let config = apply_cfg_op op s.proposed_config in {s with proposed_config=config; changeset=(op :: s.changeset)} +let load w s file = + let ct = Vyos1x.Config_file.load_config file in + match ct with + | Error e -> raise (Session_error (Printf.sprintf "Error loading config: %s" e)) + | Ok config -> + validate_tree w config; {s with proposed_config=config;} + let get_value w s path = if not (VT.exists s.proposed_config path) then raise (Session_error ("Config path does not exist")) diff --git a/src/session.mli b/src/session.mli index 2166a80..fec6a4b 100644 --- a/src/session.mli +++ b/src/session.mli @@ -32,6 +32,8 @@ val set : world -> session_data -> string list -> session_data val delete : world -> session_data -> string list -> session_data +val load : world -> session_data -> string -> session_data + val get_value : world -> session_data -> string list -> string val get_values : world -> session_data -> string list -> string list diff --git a/src/vyconf_pbt.ml b/src/vyconf_pbt.ml index 8a781b5..09e84fb 100644 --- a/src/vyconf_pbt.ml +++ b/src/vyconf_pbt.ml @@ -141,6 +141,7 @@ type request = | Validate of request_validate | Teardown of request_teardown | Reload_reftree of request_reload_reftree + | Load of request_load type request_envelope = { token : string option; @@ -795,6 +796,7 @@ let rec pp_request fmt (v:request) = | Validate x -> Format.fprintf fmt "@[Validate(@,%a)@]" pp_request_validate x | Teardown x -> Format.fprintf fmt "@[Teardown(@,%a)@]" pp_request_teardown x | Reload_reftree x -> Format.fprintf fmt "@[Reload_reftree(@,%a)@]" pp_request_reload_reftree x + | Load x -> Format.fprintf fmt "@[Load(@,%a)@]" pp_request_load x let rec pp_request_envelope fmt (v:request_envelope) = let pp_i fmt () = @@ -1153,6 +1155,9 @@ let rec encode_pb_request (v:request) encoder = | Reload_reftree x -> Pbrt.Encoder.nested encode_pb_request_reload_reftree x encoder; Pbrt.Encoder.key 23 Pbrt.Bytes encoder; + | Load x -> + Pbrt.Encoder.nested encode_pb_request_load x encoder; + Pbrt.Encoder.key 24 Pbrt.Bytes encoder; end let rec encode_pb_request_envelope (v:request_envelope) encoder = @@ -1797,6 +1802,7 @@ let rec decode_pb_request d = | Some (21, _) -> (Validate (decode_pb_request_validate (Pbrt.Decoder.nested d)) : request) | Some (22, _) -> (Teardown (decode_pb_request_teardown (Pbrt.Decoder.nested d)) : request) | Some (23, _) -> (Reload_reftree (decode_pb_request_reload_reftree (Pbrt.Decoder.nested d)) : request) + | Some (24, _) -> (Load (decode_pb_request_load (Pbrt.Decoder.nested d)) : request) | Some (n, payload_kind) -> ( Pbrt.Decoder.skip d payload_kind; loop () diff --git a/src/vyconf_pbt.mli b/src/vyconf_pbt.mli index c7e0438..c233267 100644 --- a/src/vyconf_pbt.mli +++ b/src/vyconf_pbt.mli @@ -148,6 +148,7 @@ type request = | Validate of request_validate | Teardown of request_teardown | Reload_reftree of request_reload_reftree + | Load of request_load type request_envelope = { token : string option; diff --git a/src/vyconfd.ml b/src/vyconfd.ml index a5117b6..960e523 100644 --- a/src/vyconfd.ml +++ b/src/vyconfd.ml @@ -163,6 +163,14 @@ let delete world token (req: request_delete) = response_tmpl with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} +let load world token (req: request_load) = + try + let session = Session.load world (find_session token) req.location + in + Hashtbl.replace sessions token session; + response_tmpl + with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} + let commit world token (req: request_commit) = let s = find_session token in let at = world.Session.running_config in @@ -251,6 +259,7 @@ let rec handle_connection world ic oc () = | Some t, Validate r -> validate world t r | Some t, Set r -> set world t r | Some t, Delete r -> delete world t r + | Some t, Load r -> load world t r | _ -> failwith "Unimplemented" ) |> Lwt.return end -- cgit v1.2.3