Pino Toscano
2014-May-26 16:58 UTC
[Libguestfs] [PATCH] builder: support aliases for images (RHBZ#1098718).
--- builder/builder.ml | 12 ++++++++++++ builder/index_parser.ml | 16 ++++++++++++++++ builder/index_parser.mli | 4 ++++ builder/list_entries.ml | 17 +++++++++++++++++ builder/virt-builder.pod | 8 ++++++++ 5 files changed, 57 insertions(+) diff --git a/builder/builder.ml b/builder/builder.ml index a0ef6d7..c317816 100644 --- a/builder/builder.ml +++ b/builder/builder.ml @@ -192,6 +192,18 @@ let main () | (`Install|`Notes) as mode -> mode in (* Which os-version (ie. index entry)? *) + let arg + (* Try to resolve the alias. *) + try + let item + List.find ( + fun (name, { Index_parser.aliases = aliases }) -> + match aliases with + | None -> false + | Some l -> List.mem arg l + ) index in + fst item + with Not_found -> arg in let item try List.find ( fun (name, { Index_parser.arch = a }) -> diff --git a/builder/index_parser.ml b/builder/index_parser.ml index 40b2116..0040bf9 100644 --- a/builder/index_parser.ml +++ b/builder/index_parser.ml @@ -38,11 +38,14 @@ and entry = { lvexpand : string option; notes : (string * string) list; hidden : bool; + aliases : string list option; sigchecker : Sigchecker.t; proxy : Downloader.proxy_mode; } +let list_separator = " " + let print_entry chan (name, { printable_name = printable_name; file_uri = file_uri; arch = arch; @@ -56,6 +59,7 @@ let print_entry chan (name, { printable_name = printable_name; expand = expand; lvexpand = lvexpand; notes = notes; + aliases = aliases; hidden = hidden }) let fp fs = fprintf chan fs in fp "[%s]\n" name; @@ -101,6 +105,10 @@ let print_entry chan (name, { printable_name = printable_name; | "" -> fp "notes=%s\n" notes | lang -> fp "notes[%s]=%s\n" lang notes ) notes; + (match aliases with + | None -> () + | Some l -> fp "aliases=%s\n" (String.concat list_separator l) + ); if hidden then fp "hidden=true\n" let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source @@ -245,6 +253,13 @@ let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source eprintf (f_"virt-builder: cannot parse 'hidden' field for '%s'\n") n; corrupt_file () in + let aliases + let l + try string_nsplit list_separator (List.assoc ("aliases", None) fields) + with Not_found -> [] in + match l with + | [] -> None + | l -> Some l in let entry = { printable_name = printable_name; osinfo = osinfo; @@ -260,6 +275,7 @@ let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source lvexpand = lvexpand; notes = notes; hidden = hidden; + aliases = aliases; proxy = proxy; sigchecker = sigchecker } in n, entry diff --git a/builder/index_parser.mli b/builder/index_parser.mli index a714d05..97f8c40 100644 --- a/builder/index_parser.mli +++ b/builder/index_parser.mli @@ -32,9 +32,13 @@ and entry = { lvexpand : string option; notes : (string * string) list; hidden : bool; + aliases : string list option; sigchecker : Sigchecker.t; proxy : Downloader.proxy_mode; } val get_index : prog:string -> debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> proxy:Downloader.proxy_mode -> string -> index + +(* The separator string for elements in values of type list. *) +val list_separator : string diff --git a/builder/list_entries.ml b/builder/list_entries.ml index 505a1b9..9264cfc 100644 --- a/builder/list_entries.ml +++ b/builder/list_entries.ml @@ -65,6 +65,7 @@ and list_entries_long ~sources index size = size; compressed_size = compressed_size; notes = notes; + aliases = aliases; hidden = hidden }) -> if not hidden then ( printf "%-24s %s\n" "os-version:" name; @@ -79,6 +80,11 @@ and list_entries_long ~sources index | Some size -> printf "%-24s %s\n" (s_"Download size:") (human_size size); ); + (match aliases with + | None -> () + | Some l -> printf "%-24s %s\n" (s_"Aliases:") + (String.concat Index_parser.list_separator l); + ); let notes = Languages.find_notes langs notes in (match notes with | notes :: _ -> @@ -116,6 +122,15 @@ and list_entries_json ~sources index | None -> () | Some n -> printf " \"%s\": \"%Ld\",\n" key n in + let json_optional_printf_stringlist key = function + | None -> () + | Some l -> + printf " \"%s\": [" key; + iteri ( + fun i alias -> + printf " \"%s\"%s" alias (trailing_comma i (List.length l)) + ) l; + printf " ],\n" in let print_notes = function | [] -> () | notes -> @@ -156,6 +171,7 @@ and list_entries_json ~sources index size = size; compressed_size = compressed_size; notes = notes; + aliases = aliases; hidden = hidden }) -> printf " {\n"; printf " \"os-version\": \"%s\",\n" name; @@ -164,6 +180,7 @@ and list_entries_json ~sources index printf " \"size\": %Ld,\n" size; json_optional_printf_int64 "compressed-size" compressed_size; print_notes notes; + json_optional_printf_stringlist "aliases" aliases; printf " \"hidden\": %s\n" (json_string_of_bool hidden); printf " }%s\n" (trailing_comma i (List.length index)) ) index; diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod index 5c531de..a70767f 100644 --- a/builder/virt-builder.pod +++ b/builder/virt-builder.pod @@ -1288,6 +1288,14 @@ Using the hidden flag prevents the template from being listed by the I<--list> option (but it is still installable). This is used for test images. +=item C<aliases=ALIAS1 ALIAS2 ...> + +This optional field specifies a list of aliases, separated by spaces, +for the image. For example, an alias could be used to always point +to the latest version of a certain image, leaving the old versions +available in the index instead of updating the same image (see the +C<revision> field). + =back =head3 Running virt-builder against multiple sources -- 1.9.3
Richard W.M. Jones
2014-May-27 08:14 UTC
Re: [Libguestfs] [PATCH] builder: support aliases for images (RHBZ#1098718).
On Mon, May 26, 2014 at 06:58:25PM +0200, Pino Toscano wrote:> --- > builder/builder.ml | 12 ++++++++++++ > builder/index_parser.ml | 16 ++++++++++++++++ > builder/index_parser.mli | 4 ++++ > builder/list_entries.ml | 17 +++++++++++++++++ > builder/virt-builder.pod | 8 ++++++++ > 5 files changed, 57 insertions(+) > > diff --git a/builder/builder.ml b/builder/builder.ml > index a0ef6d7..c317816 100644 > --- a/builder/builder.ml > +++ b/builder/builder.ml > @@ -192,6 +192,18 @@ let main () > | (`Install|`Notes) as mode -> mode in > > (* Which os-version (ie. index entry)? *) > + let arg > + (* Try to resolve the alias. *) > + try > + let item > + List.find ( > + fun (name, { Index_parser.aliases = aliases }) -> > + match aliases with > + | None -> false > + | Some l -> List.mem arg l > + ) index in > + fst item > + with Not_found -> arg in > let item > try List.find ( > fun (name, { Index_parser.arch = a }) -> > diff --git a/builder/index_parser.ml b/builder/index_parser.ml > index 40b2116..0040bf9 100644 > --- a/builder/index_parser.ml > +++ b/builder/index_parser.ml > @@ -38,11 +38,14 @@ and entry = { > lvexpand : string option; > notes : (string * string) list; > hidden : bool; > + aliases : string list option; > > sigchecker : Sigchecker.t; > proxy : Downloader.proxy_mode; > } > > +let list_separator = " "Any reason to define this?> let print_entry chan (name, { printable_name = printable_name; > file_uri = file_uri; > arch = arch; > @@ -56,6 +59,7 @@ let print_entry chan (name, { printable_name = printable_name; > expand = expand; > lvexpand = lvexpand; > notes = notes; > + aliases = aliases; > hidden = hidden }) > let fp fs = fprintf chan fs in > fp "[%s]\n" name; > @@ -101,6 +105,10 @@ let print_entry chan (name, { printable_name = printable_name; > | "" -> fp "notes=%s\n" notes > | lang -> fp "notes[%s]=%s\n" lang notes > ) notes; > + (match aliases with > + | None -> () > + | Some l -> fp "aliases=%s\n" (String.concat list_separator l) > + ); > if hidden then fp "hidden=true\n" > > let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source > @@ -245,6 +253,13 @@ let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source > eprintf (f_"virt-builder: cannot parse 'hidden' field for '%s'\n") > n; > corrupt_file () in > + let aliases > + let l > + try string_nsplit list_separator (List.assoc ("aliases", None) fields) > + with Not_found -> [] in > + match l with > + | [] -> None > + | l -> Some l in > > let entry = { printable_name = printable_name; > osinfo = osinfo; > @@ -260,6 +275,7 @@ let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source > lvexpand = lvexpand; > notes = notes; > hidden = hidden; > + aliases = aliases; > proxy = proxy; > sigchecker = sigchecker } in > n, entry > diff --git a/builder/index_parser.mli b/builder/index_parser.mli > index a714d05..97f8c40 100644 > --- a/builder/index_parser.mli > +++ b/builder/index_parser.mli > @@ -32,9 +32,13 @@ and entry = { > lvexpand : string option; > notes : (string * string) list; > hidden : bool; > + aliases : string list option; > > sigchecker : Sigchecker.t; > proxy : Downloader.proxy_mode; > } > > val get_index : prog:string -> debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> proxy:Downloader.proxy_mode -> string -> index > + > +(* The separator string for elements in values of type list. *) > +val list_separator : string > diff --git a/builder/list_entries.ml b/builder/list_entries.ml > index 505a1b9..9264cfc 100644 > --- a/builder/list_entries.ml > +++ b/builder/list_entries.ml > @@ -65,6 +65,7 @@ and list_entries_long ~sources index > size = size; > compressed_size = compressed_size; > notes = notes; > + aliases = aliases; > hidden = hidden }) -> > if not hidden then ( > printf "%-24s %s\n" "os-version:" name; > @@ -79,6 +80,11 @@ and list_entries_long ~sources index > | Some size -> > printf "%-24s %s\n" (s_"Download size:") (human_size size); > ); > + (match aliases with > + | None -> () > + | Some l -> printf "%-24s %s\n" (s_"Aliases:") > + (String.concat Index_parser.list_separator l); > + ); > let notes = Languages.find_notes langs notes in > (match notes with > | notes :: _ -> > @@ -116,6 +122,15 @@ and list_entries_json ~sources index > | None -> () > | Some n -> > printf " \"%s\": \"%Ld\",\n" key n in > + let json_optional_printf_stringlist key = function > + | None -> () > + | Some l -> > + printf " \"%s\": [" key; > + iteri ( > + fun i alias -> > + printf " \"%s\"%s" alias (trailing_comma i (List.length l)) > + ) l; > + printf " ],\n" in > let print_notes = function > | [] -> () > | notes -> > @@ -156,6 +171,7 @@ and list_entries_json ~sources index > size = size; > compressed_size = compressed_size; > notes = notes; > + aliases = aliases; > hidden = hidden }) -> > printf " {\n"; > printf " \"os-version\": \"%s\",\n" name; > @@ -164,6 +180,7 @@ and list_entries_json ~sources index > printf " \"size\": %Ld,\n" size; > json_optional_printf_int64 "compressed-size" compressed_size; > print_notes notes; > + json_optional_printf_stringlist "aliases" aliases; > printf " \"hidden\": %s\n" (json_string_of_bool hidden); > printf " }%s\n" (trailing_comma i (List.length index)) > ) index; > diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod > index 5c531de..a70767f 100644 > --- a/builder/virt-builder.pod > +++ b/builder/virt-builder.pod > @@ -1288,6 +1288,14 @@ Using the hidden flag prevents the template from being listed by the > I<--list> option (but it is still installable). This is used for test > images. > > +=item C<aliases=ALIAS1 ALIAS2 ...> > + > +This optional field specifies a list of aliases, separated by spaces, > +for the image. For example, an alias could be used to always point > +to the latest version of a certain image, leaving the old versions > +available in the index instead of updating the same image (see the > +C<revision> field). > + > =back > > =head3 Running virt-builder against multiple sourcesLooks fine. I would remove the list_separator definition, because I think it obscures the code by making people refer to two places at once. ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top
Pino Toscano
2014-May-27 08:52 UTC
Re: [Libguestfs] [PATCH] builder: support aliases for images (RHBZ#1098718).
On Tuesday 27 May 2014 09:14:45 Richard W.M. Jones wrote:> On Mon, May 26, 2014 at 06:58:25PM +0200, Pino Toscano wrote: > > --- > > > > builder/builder.ml | 12 ++++++++++++ > > builder/index_parser.ml | 16 ++++++++++++++++ > > builder/index_parser.mli | 4 ++++ > > builder/list_entries.ml | 17 +++++++++++++++++ > > builder/virt-builder.pod | 8 ++++++++ > > 5 files changed, 57 insertions(+) > > > > diff --git a/builder/builder.ml b/builder/builder.ml > > index a0ef6d7..c317816 100644 > > --- a/builder/builder.ml > > +++ b/builder/builder.ml > > @@ -192,6 +192,18 @@ let main () > > > > | (`Install|`Notes) as mode -> mode in > > > > (* Which os-version (ie. index entry)? *) > > > > + let arg > > + (* Try to resolve the alias. *) > > + try > > + let item > > + List.find ( > > + fun (name, { Index_parser.aliases = aliases }) -> > > + match aliases with > > + | None -> false > > + | Some l -> List.mem arg l > > + ) index in > > + fst item > > + with Not_found -> arg in > > > > let item > > > > try List.find ( > > > > fun (name, { Index_parser.arch = a }) -> > > > > diff --git a/builder/index_parser.ml b/builder/index_parser.ml > > index 40b2116..0040bf9 100644 > > --- a/builder/index_parser.ml > > +++ b/builder/index_parser.ml > > @@ -38,11 +38,14 @@ and entry = { > > > > lvexpand : string option; > > notes : (string * string) list; > > hidden : bool; > > > > + aliases : string list option; > > > > sigchecker : Sigchecker.t; > > proxy : Downloader.proxy_mode; > > > > } > > > > +let list_separator = " " > > Any reason to define this?Mostly to have the separator for list entries defined once in a single place.> > let print_entry chan (name, { printable_name = printable_name; > > > > file_uri = file_uri; > > arch = arch; > > > > @@ -56,6 +59,7 @@ let print_entry chan (name, { printable_name > > printable_name;> > > expand = expand; > > lvexpand = lvexpand; > > notes = notes; > > > > + aliases = aliases; > > > > hidden = hidden }) > > > > let fp fs = fprintf chan fs in > > fp "[%s]\n" name; > > > > @@ -101,6 +105,10 @@ let print_entry chan (name, { printable_name > > printable_name;> > > | "" -> fp "notes=%s\n" notes > > | lang -> fp "notes[%s]=%s\n" lang notes > > > > ) notes; > > > > + (match aliases with > > + | None -> () > > + | Some l -> fp "aliases=%s\n" (String.concat list_separator l) > > + ); > > > > if hidden then fp "hidden=true\n" > > > > let get_index ~prog ~debug ~downloader ~sigchecker ~proxy source > > > > @@ -245,6 +253,13 @@ let get_index ~prog ~debug ~downloader > > ~sigchecker ~proxy source => > > eprintf (f_"virt-builder: cannot parse 'hidden' field > > for '%s'\n") > > > > n; > > > > corrupt_file () in > > > > + let aliases > > + let l > > + try string_nsplit list_separator (List.assoc > > ("aliases", None) fields) + with Not_found -> [] in > > + match l with > > + | [] -> None > > + | l -> Some l in > > > > let entry = { printable_name = printable_name; > > > > osinfo = osinfo; > > > > @@ -260,6 +275,7 @@ let get_index ~prog ~debug ~downloader > > ~sigchecker ~proxy source => > > lvexpand = lvexpand; > > notes = notes; > > hidden = hidden; > > > > + aliases = aliases; > > > > proxy = proxy; > > sigchecker = sigchecker } in > > > > n, entry > > > > diff --git a/builder/index_parser.mli b/builder/index_parser.mli > > index a714d05..97f8c40 100644 > > --- a/builder/index_parser.mli > > +++ b/builder/index_parser.mli > > @@ -32,9 +32,13 @@ and entry = { > > > > lvexpand : string option; > > notes : (string * string) list; > > hidden : bool; > > > > + aliases : string list option; > > > > sigchecker : Sigchecker.t; > > proxy : Downloader.proxy_mode; > > > > } > > > > val get_index : prog:string -> debug:bool -> > > downloader:Downloader.t -> sigchecker:Sigchecker.t -> > > proxy:Downloader.proxy_mode -> string -> index> > > + > > +(* The separator string for elements in values of type list. *) > > +val list_separator : string > > diff --git a/builder/list_entries.ml b/builder/list_entries.ml > > index 505a1b9..9264cfc 100644 > > --- a/builder/list_entries.ml > > +++ b/builder/list_entries.ml > > @@ -65,6 +65,7 @@ and list_entries_long ~sources index > > > > size = size; > > compressed_size = compressed_size; > > notes = notes; > > > > + aliases = aliases; > > > > hidden = hidden }) -> > > > > if not hidden then ( > > > > printf "%-24s %s\n" "os-version:" name; > > > > @@ -79,6 +80,11 @@ and list_entries_long ~sources index > > > > | Some size -> > > | > > printf "%-24s %s\n" (s_"Download size:") (human_size > > size); > > > > ); > > > > + (match aliases with > > + | None -> () > > + | Some l -> printf "%-24s %s\n" (s_"Aliases:") > > + (String.concat Index_parser.list_separator > > l); > > + ); > > > > let notes = Languages.find_notes langs notes in > > (match notes with > > > > | notes :: _ -> > > > > @@ -116,6 +122,15 @@ and list_entries_json ~sources index > > > > | None -> () > > | Some n -> > > | > > printf " \"%s\": \"%Ld\",\n" key n in > > > > + let json_optional_printf_stringlist key = function > > + | None -> () > > + | Some l -> > > + printf " \"%s\": [" key; > > + iteri ( > > + fun i alias -> > > + printf " \"%s\"%s" alias (trailing_comma i (List.length > > l)) + ) l; > > + printf " ],\n" in > > > > let print_notes = function > > > > | [] -> () > > | notes -> > > > > @@ -156,6 +171,7 @@ and list_entries_json ~sources index > > > > size = size; > > compressed_size = compressed_size; > > notes = notes; > > > > + aliases = aliases; > > > > hidden = hidden }) -> > > > > printf " {\n"; > > printf " \"os-version\": \"%s\",\n" name; > > > > @@ -164,6 +180,7 @@ and list_entries_json ~sources index > > > > printf " \"size\": %Ld,\n" size; > > json_optional_printf_int64 "compressed-size" compressed_size; > > print_notes notes; > > > > + json_optional_printf_stringlist "aliases" aliases; > > > > printf " \"hidden\": %s\n" (json_string_of_bool hidden); > > printf " }%s\n" (trailing_comma i (List.length index)) > > > > ) index; > > > > diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod > > index 5c531de..a70767f 100644 > > --- a/builder/virt-builder.pod > > +++ b/builder/virt-builder.pod > > @@ -1288,6 +1288,14 @@ Using the hidden flag prevents the template > > from being listed by the> > > I<--list> option (but it is still installable). This is used for > > test images. > > > > +=item C<aliases=ALIAS1 ALIAS2 ...> > > + > > +This optional field specifies a list of aliases, separated by > > spaces, +for the image. For example, an alias could be used to > > always point +to the latest version of a certain image, leaving the > > old versions +available in the index instead of updating the same > > image (see the +C<revision> field). > > + > > > > =back > > > > =head3 Running virt-builder against multiple sources > > Looks fine. I would remove the list_separator definition, because I > think it obscures the code by making people refer to two places at > once.OK, I will remove it and push. Thanks, -- Pino Toscano