From 9e8feea52140222c689af1439eb7be63a9e121da Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Sun, 6 Apr 2025 18:26:13 -0500 Subject: T7321: add discard operation --- data/vyconf.proto | 5 +++++ src/session.ml | 3 +++ src/session.mli | 2 ++ src/vyconf_pbt.ml | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vyconf_pbt.mli | 20 +++++++++++++++++++ src/vyconfd.ml | 9 +++++++++ 6 files changed, 96 insertions(+) diff --git a/data/vyconf.proto b/data/vyconf.proto index 5fc9f76..69bc1d4 100644 --- a/data/vyconf.proto +++ b/data/vyconf.proto @@ -34,6 +34,10 @@ message Request { repeated string Path = 1; } + message Discard { + optional int32 dummy = 1; + } + message Rename { repeated string EditLevel = 1; required string From = 2; @@ -149,6 +153,7 @@ message Request { Teardown teardown = 22; ReloadReftree reload_reftree = 23; Load load = 24; + Discard discard = 25; } } diff --git a/src/session.ml b/src/session.ml index 5f0d5a3..953df25 100644 --- a/src/session.ml +++ b/src/session.ml @@ -107,6 +107,9 @@ 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 discard w s = + {s with proposed_config=w.running_config} + let load w s file = let ct = Vyos1x.Config_file.load_config file in match ct with diff --git a/src/session.mli b/src/session.mli index f756858..af12af8 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 discard : world -> session_data -> session_data + val load : world -> session_data -> string -> session_data val save : world -> session_data -> string -> session_data diff --git a/src/vyconf_pbt.ml b/src/vyconf_pbt.ml index 09e84fb..c8e76ef 100644 --- a/src/vyconf_pbt.ml +++ b/src/vyconf_pbt.ml @@ -32,6 +32,10 @@ type request_delete = { path : string list; } +type request_discard = { + dummy : int32 option; +} + type request_rename = { edit_level : string list; from : string; @@ -142,6 +146,7 @@ type request = | Teardown of request_teardown | Reload_reftree of request_reload_reftree | Load of request_load + | Discard of request_discard type request_envelope = { token : string option; @@ -206,6 +211,12 @@ let rec default_request_delete path; } +let rec default_request_discard + ?dummy:((dummy:int32 option) = None) + () : request_discard = { + dummy; +} + let rec default_request_rename ?edit_level:((edit_level:string list) = []) ?from:((from:string) = "") @@ -408,6 +419,14 @@ let default_request_delete_mutable () : request_delete_mutable = { path = []; } +type request_discard_mutable = { + mutable dummy : int32 option; +} + +let default_request_discard_mutable () : request_discard_mutable = { + dummy = None; +} + type request_rename_mutable = { mutable edit_level : string list; mutable from : string; @@ -646,6 +665,12 @@ let rec pp_request_delete fmt (v:request_delete) = in Pbrt.Pp.pp_brk pp_i fmt () +let rec pp_request_discard fmt (v:request_discard) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "dummy" (Pbrt.Pp.pp_option Pbrt.Pp.pp_int32) fmt v.dummy; + in + Pbrt.Pp.pp_brk pp_i fmt () + let rec pp_request_rename fmt (v:request_rename) = let pp_i fmt () = Pbrt.Pp.pp_record_field ~first:true "edit_level" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.edit_level; @@ -797,6 +822,7 @@ let rec pp_request fmt (v:request) = | 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 + | Discard x -> Format.fprintf fmt "@[Discard(@,%a)@]" pp_request_discard x let rec pp_request_envelope fmt (v:request_envelope) = let pp_i fmt () = @@ -894,6 +920,15 @@ let rec encode_pb_request_delete (v:request_delete) encoder = ) v.path encoder; () +let rec encode_pb_request_discard (v:request_discard) encoder = + begin match v.dummy with + | Some x -> + Pbrt.Encoder.int32_as_varint x encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + | None -> (); + end; + () + let rec encode_pb_request_rename (v:request_rename) encoder = Pbrt.List_util.rev_iter_with (fun x encoder -> Pbrt.Encoder.string x encoder; @@ -1158,6 +1193,9 @@ let rec encode_pb_request (v:request) encoder = | Load x -> Pbrt.Encoder.nested encode_pb_request_load x encoder; Pbrt.Encoder.key 24 Pbrt.Bytes encoder; + | Discard x -> + Pbrt.Encoder.nested encode_pb_request_discard x encoder; + Pbrt.Encoder.key 25 Pbrt.Bytes encoder; end let rec encode_pb_request_envelope (v:request_envelope) encoder = @@ -1333,6 +1371,24 @@ let rec decode_pb_request_delete d = path = v.path; } : request_delete) +let rec decode_pb_request_discard d = + let v = default_request_discard_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.dummy <- Some (Pbrt.Decoder.int32_as_varint d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_discard), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + dummy = v.dummy; + } : request_discard) + let rec decode_pb_request_rename d = let v = default_request_rename_mutable () in let continue__= ref true in @@ -1803,6 +1859,7 @@ let rec decode_pb_request d = | 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 (25, _) -> (Discard (decode_pb_request_discard (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 c233267..b4affb8 100644 --- a/src/vyconf_pbt.mli +++ b/src/vyconf_pbt.mli @@ -39,6 +39,10 @@ type request_delete = { path : string list; } +type request_discard = { + dummy : int32 option; +} + type request_rename = { edit_level : string list; from : string; @@ -149,6 +153,7 @@ type request = | Teardown of request_teardown | Reload_reftree of request_reload_reftree | Load of request_load + | Discard of request_discard type request_envelope = { token : string option; @@ -217,6 +222,12 @@ val default_request_delete : request_delete (** [default_request_delete ()] is the default value for type [request_delete] *) +val default_request_discard : + ?dummy:int32 option -> + unit -> + request_discard +(** [default_request_discard ()] is the default value for type [request_discard] *) + val default_request_rename : ?edit_level:string list -> ?from:string -> @@ -385,6 +396,9 @@ val pp_request_set : Format.formatter -> request_set -> unit val pp_request_delete : Format.formatter -> request_delete -> unit (** [pp_request_delete v] formats v *) +val pp_request_discard : Format.formatter -> request_discard -> unit +(** [pp_request_discard v] formats v *) + val pp_request_rename : Format.formatter -> request_rename -> unit (** [pp_request_rename v] formats v *) @@ -478,6 +492,9 @@ val encode_pb_request_set : request_set -> Pbrt.Encoder.t -> unit val encode_pb_request_delete : request_delete -> Pbrt.Encoder.t -> unit (** [encode_pb_request_delete v encoder] encodes [v] with the given [encoder] *) +val encode_pb_request_discard : request_discard -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_discard v encoder] encodes [v] with the given [encoder] *) + val encode_pb_request_rename : request_rename -> Pbrt.Encoder.t -> unit (** [encode_pb_request_rename v encoder] encodes [v] with the given [encoder] *) @@ -571,6 +588,9 @@ val decode_pb_request_set : Pbrt.Decoder.t -> request_set val decode_pb_request_delete : Pbrt.Decoder.t -> request_delete (** [decode_pb_request_delete decoder] decodes a [request_delete] binary value from [decoder] *) +val decode_pb_request_discard : Pbrt.Decoder.t -> request_discard +(** [decode_pb_request_discard decoder] decodes a [request_discard] binary value from [decoder] *) + val decode_pb_request_rename : Pbrt.Decoder.t -> request_rename (** [decode_pb_request_rename decoder] decodes a [request_rename] binary value from [decoder] *) diff --git a/src/vyconfd.ml b/src/vyconfd.ml index e531278..e37a6ae 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 discard world token (_req: request_discard) = + try + let session = Session.discard world (find_session token) + in + Hashtbl.replace sessions token session; + 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 @@ -266,6 +274,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, Discard r -> discard world t r | Some t, Load r -> load world t r | Some t, Save r -> save world t r | _ -> failwith "Unimplemented" -- cgit v1.2.3