[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