WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH] Fix terrible error message when bootloader fails

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH] Fix terrible error message when bootloader fails
From: David Scott <dave.scott@xxxxxxxxxxxxx>
Date: Tue, 26 Jan 2010 14:44:47 +0000
Delivery-date: Tue, 26 Jan 2010 06:37:49 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User David Scott <dave.scott@xxxxxxxxxxxxx>
# Date 1264517064 0
# Node ID ca18fc5c917111068f242fe8b21b9e9558f3d5a9
# Parent  22cd3f304b9e0818b80ac5a40e6d4c6438c5e58a
CA-37080: fix terrible error message when a 'rhlike' guest (e.g. CentOS) cannot 
be installed because an update file is missing in dom0.

Converts this:

[root@h07 ~]# xe vm-start vm=centos54
The bootloader returned an error
vm: 13b688dd-da80-1ee3-bbe8-875fffc5736f (centos54)
msg: Error from bootloader: Failed to parse the output of bootloader: ()

Into this:

[root@h07 ~]# xe vm-start vm=centos54
Error code: SUPPORT_PACKAGE_MISSING
Error parameters: Dom0 does not contain a required file: 
/opt/xensource/packages/files/guest-installer/el5.4-initrd-additions.cpio, ,

Thanks to Vern Burke for helping me debug this.

Signed-off-by: David Scott <dave.scott@xxxxxxxxxxxxx>

diff -r 22cd3f304b9e -r ca18fc5c9171 ocaml/xapi/bootloader.ml
--- a/ocaml/xapi/bootloader.ml  Thu Jan 21 15:45:09 2010 +0000
+++ b/ocaml/xapi/bootloader.ml  Tue Jan 26 14:44:24 2010 +0000
@@ -52,7 +52,7 @@
 
 let parse_output x = 
   let sexpr = "(" ^ x ^ ")" in
-  let parse_failed = Error(Printf.sprintf "Failed to parse the output of 
bootloader: %s" sexpr) in
+  let parse_failed = Error(Printf.sprintf "Expecting an s-expression; 
received: %s" sexpr) in
   let sexpr' = SExpr_TS.of_string sexpr in
   match sexpr' with
     (* linux (kernel /var/lib/xen/vmlinuz.y1Wmrp)(args 'root=/dev/sda1 ro') *)
@@ -68,6 +68,11 @@
        debug "Failed to parse: %s" sexpr;
        raise parse_failed
 
+let parse_exception x = 
+  match Stringext.String.split '\n' x with
+  | code :: params -> raise (Api_errors.Server_error(code, params))
+  | _ -> failwith (Printf.sprintf "Failed to parse stderr output of 
bootloader: %s" x)
+
 (** Extract the default kernel using the -q option *)
 let extract_default_kernel bootloader disks legacy_args extra_args 
pv_bootloader_args vm_uuid =
   let bootloader_path = List.assoc bootloader Xapi_globs.supported_bootloaders 
in
@@ -78,34 +83,11 @@
   let disk = List.hd disks in
   let cmdline = bootloader_args true extra_args legacy_args pv_bootloader_args 
disk vm_uuid in
   debug "Bootloader commandline: %s %s\n" bootloader_path (String.concat " " 
cmdline);
+  try
+       parse_output (Helpers.call_script ~log_successful_output:false 
bootloader_path cmdline)
+  with Forkhelpers.Spawn_internal_error(stderr, stdout, _) ->
+         parse_exception stderr
 
-  let result_out, result_in = Unix.pipe() in
-  let fds_to_close = ref [ result_out; result_in ] in
-  let close' fd = 
-    if List.mem fd !fds_to_close 
-    then (Unix.close fd; fds_to_close := List.filter (fun x -> x <> fd) 
!fds_to_close) in
-  finally  (* make sure I close all my open fds in the end *)
-    (fun () ->
-       (* Capture stderr output for logging *)
-       match with_logfile_fd "bootloader"
-       (fun log_fd ->
-         let pid = safe_close_and_exec None (Some result_in) (Some log_fd) [] 
bootloader_path cmdline in
-         (* parent *)
-         List.iter close' [ result_in ];
-         finally (* always waitpid eventually *)
-           (fun () ->
-              let output = Unixext.read_whole_file 500 500 result_out in
-              (* Do something with it *)
-              parse_output output)
-           (fun () -> waitpid pid)) with
-       | Success(_, x) -> debug "bootloader subprocess succeeded"; x
-       | Failure(log, Subprocess_failed n) ->
-          raise (Error (Printf.sprintf "Return code: %d; Log = %s" n log))
-       | Failure(log, exn) ->
-          debug "Error from bootloader: %s" log;
-          raise exn)
-    (fun () -> List.iter Unix.close !fds_to_close)
-         
 let delete_extracted_kernel x = 
   Unix.unlink x.kernel_path;
   match x.initrd_path with
1 file changed, 10 insertions(+), 28 deletions(-)
ocaml/xapi/bootloader.ml |   38 ++++++++++----------------------------


Attachment: xen-api.hg.patch
Description: Text Data

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-API] [PATCH] Fix terrible error message when bootloader fails, David Scott <=