[Libguestfs] [PATCH] builder: add an arch field to sources read from indexes

Richard W.M. Jones rjones at redhat.com
Fri Feb 21 16:29:23 UTC 2014


On Fri, Feb 21, 2014 at 05:17:59PM +0100, Pino Toscano wrote:
> Add an architecture field for all the entries in each index, so we know
> which architecture they are (not used right now, but will be in the
> future).
> 
> The problematic part here is properly marking with the correct
> architecture: since we only know the current index on libguestfs.org
> contains x86_64/amd64 images, entries coming from it are marked that
> way; images in all the other indexes (user-provided ones) are not known
> to us, so assume they are using the same architecture as virt-builder,
> hence the special "@same".

A few questions:

 - Would it be better/easier if we ditched the whole idea of
   VIRT_BUILDER_SOURCE being a list?  It wasn't really a great idea in
   hindsight, and we could change it now.  It's even possible to not
   have VIRT_BUILDER_SOURCE at all, everything is configured through
   the config files.

 - Can we force people to put an arch= field in the index, and if it
   is missing, assume x86_64?

(Both of these would mean we didn't need @same, IIUI.)

Rich.

> ---
>  builder/builder.ml       |  5 +++--
>  builder/cmdline.ml       | 16 +++++++++-------
>  builder/index_parser.ml  |  6 +++++-
>  builder/index_parser.mli |  3 ++-
>  4 files changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/builder/builder.ml b/builder/builder.ml
> index 80ccef7..d6d7570 100644
> --- a/builder/builder.ml
> +++ b/builder/builder.ml
> @@ -42,7 +42,7 @@ let main () =
>      edit, firstboot, run, format, gpg, hostname, install, list_format, links,
>      memsize, mkdirs,
>      network, output, password_crypto, quiet, root_password, scrub,
> -    scrub_logfile, selinux_relabel, size, smp, sources, sync, timezone,
> +    scrub_logfile, selinux_relabel, size, smp, sources, indexarch, sync, timezone,
>      update, upload, writes =
>      parse_cmdline () in
>  
> @@ -143,7 +143,8 @@ let main () =
>            let sigchecker =
>              Sigchecker.create ~debug ~gpg ~check_signature
>                ~gpgkey:(Sigchecker.Fingerprint fingerprint) in
> -          Index_parser.get_index ~prog ~debug ~downloader ~sigchecker source
> +          Index_parser.get_index ~prog ~debug ~downloader ~sigchecker
> +            ~arch:indexarch source
>        ) sources
>      ) in
>  
> diff --git a/builder/cmdline.ml b/builder/cmdline.ml
> index e9e47ae..8959429 100644
> --- a/builder/cmdline.ml
> +++ b/builder/cmdline.ml
> @@ -31,6 +31,8 @@ open Printf
>  let prog = Filename.basename Sys.executable_name
>  
>  let default_source = "http://libguestfs.org/download/builder/index.asc"
> +(* So far images in the "default_source" index were x86_64/amd64. *)
> +let default_source_architecture = "x86_64"
>  
>  let parse_cmdline () =
>    let display_version () =
> @@ -408,18 +410,18 @@ read the man page virt-builder(1).
>        ) in
>  
>    (* Check source(s) and fingerprint(s), or use environment or default. *)
> -  let sources =
> +  let sources, indexarch =
>      let list_split = function "" -> [] | str -> string_nsplit "," str in
>      let rec repeat x = function
>        | 0 -> [] | 1 -> [x]
>        | n -> x :: repeat x (n-1)
>      in
>  
> -    let sources =
> -      if sources <> [] then sources
> +    let sources, indexarch =
> +      if sources <> [] then sources, "@same"
>        else (
> -        try list_split (Sys.getenv "VIRT_BUILDER_SOURCE")
> -        with Not_found -> [ default_source ]
> +        try list_split (Sys.getenv "VIRT_BUILDER_SOURCE"), "@same"
> +        with Not_found -> [ default_source ], default_source_architecture
>        ) in
>      let fingerprints =
>        if fingerprints <> [] then fingerprints
> @@ -447,12 +449,12 @@ read the man page virt-builder(1).
>      assert (nr_sources > 0);
>  
>      (* Combine the sources and fingerprints into a single list of pairs. *)
> -    List.combine sources fingerprints in
> +    List.combine sources fingerprints, indexarch in
>  
>    mode, arg,
>    attach, cache, check_signature, curl, debug, delete, delete_on_failure,
>    edit, firstboot, run, format, gpg, hostname, install, list_format, links,
>    memsize, mkdirs,
>    network, output, password_crypto, quiet, root_password, scrub,
> -  scrub_logfile, selinux_relabel, size, smp, sources, sync, timezone,
> +  scrub_logfile, selinux_relabel, size, smp, sources, indexarch, sync, timezone,
>    update, upload, writes
> diff --git a/builder/index_parser.ml b/builder/index_parser.ml
> index 2d4a642..0b9a1b9 100644
> --- a/builder/index_parser.ml
> +++ b/builder/index_parser.ml
> @@ -37,6 +37,7 @@ and entry = {
>    lvexpand : string option;
>    notes : (string * string) list;
>    hidden : bool;
> +  arch : string;
>  
>    sigchecker : Sigchecker.t;
>  }
> @@ -53,6 +54,7 @@ let print_entry chan (name, { printable_name = printable_name;
>                                expand = expand;
>                                lvexpand = lvexpand;
>                                notes = notes;
> +                              arch = arch;
>                                hidden = hidden }) =
>    let fp fs = fprintf chan fs in
>    fp "[%s]\n" name;
> @@ -91,6 +93,7 @@ let print_entry chan (name, { printable_name = printable_name;
>    | None -> ()
>    | Some lvexpand -> fp "lvexpand=%s\n" lvexpand
>    );
> +  fp "arch=%s\n" arch;
>    List.iter (
>      fun (lang, notes) ->
>        match lang with
> @@ -108,7 +111,7 @@ and field = string * string option * string    (* key + subkey + value *)
>  (* Calls yyparse in the C code. *)
>  external parse_index : string -> sections = "virt_builder_parse_index"
>  
> -let get_index ~prog ~debug ~downloader ~sigchecker source =
> +let get_index ~prog ~debug ~downloader ~sigchecker ~arch source =
>    let corrupt_file () =
>      eprintf (f_"\nThe index file downloaded from '%s' is corrupt.\nYou need to ask the supplier of this file to fix it and upload a fixed version.\n")
>        source;
> @@ -255,6 +258,7 @@ let get_index ~prog ~debug ~downloader ~sigchecker source =
>                          lvexpand = lvexpand;
>                          notes = notes;
>                          hidden = hidden;
> +                        arch = arch;
>                          sigchecker = sigchecker } in
>            n, entry
>        ) sections in
> diff --git a/builder/index_parser.mli b/builder/index_parser.mli
> index 3c679b3..4fe9a8a 100644
> --- a/builder/index_parser.mli
> +++ b/builder/index_parser.mli
> @@ -31,8 +31,9 @@ and entry = {
>    lvexpand : string option;
>    notes : (string * string) list;
>    hidden : bool;
> +  arch : string;
>  
>    sigchecker : Sigchecker.t;
>  }
>  
> -val get_index : prog:string -> debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> string -> index
> +val get_index : prog:string -> debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> arch:string -> string -> index
> -- 
> 1.8.3.1
> 
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list