[Libguestfs] [PATCH] builder: support aliases for images (RHBZ#1098718).

Richard W.M. Jones rjones at redhat.com
Tue May 27 08:14:45 UTC 2014


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 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.

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




More information about the Libguestfs mailing list