[Libguestfs] [PATCH] builder: support aliases for images (RHBZ#1098718).
Pino Toscano
ptoscano at redhat.com
Tue May 27 08:52:12 UTC 2014
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
More information about the Libguestfs
mailing list