Add TODO list.
[mclu.git] / template.ml
index fffc0e4..404ec6b 100644 (file)
@@ -32,12 +32,14 @@ let templates () =
   let files = List.map ((//) template_dir) files in
   let files =
     List.filter (fun name -> Filename.check_suffix name ".template") files in
-  List.map (
-    fun filename ->
-      let name = Filename.basename filename in
-      let name = Filename.chop_suffix name ".template" in
-      (name, filename)
-  ) files
+  let templates =
+    List.map (
+      fun filename ->
+        let name = Filename.basename filename in
+        let name = Filename.chop_suffix name ".template" in
+        (name, filename)
+    ) files in
+  List.sort compare templates
 
 let template_names () = List.map fst (templates ())
 
@@ -71,10 +73,15 @@ let run_template ~verbose filename subcmd args =
 
 type template_info = {
   base_image : string;
+  guest_arch : string option;
   minimum_memory : int64 option;
   recommended_memory : int64 option;
+  minimum_size : int64 option;
   disk_bus : string option;
   network_model : string option;
+  has_xml_target : bool;
+  needs_external_kernel : bool;
+  cmdline : string option;
 }
 
 let probe ?(verbose = false) filename =
@@ -93,6 +100,10 @@ let probe ?(verbose = false) filename =
     | _ ->
       eprintf "mclu: cannot parse '%s base-image'\n" filename;
       exit 1 in
+  let guest_arch =
+    match run_template ~verbose filename "guest-arch" [] with
+    | Some [arch] -> Some arch
+    | _ -> None in
   let minimum_memory =
     match run_template ~verbose filename "minimum-memory" [] with
     | Some [memory] ->
@@ -113,6 +124,16 @@ let probe ?(verbose = false) filename =
          exit 1
       );
     | _ -> None in
+  let minimum_size =
+    match run_template ~verbose filename "minimum-size" [] with
+    | Some [size] ->
+      (try Some (bytes_of_human_size size)
+       with Not_found ->
+         eprintf "mclu: cannot parse output of '%s minimum-size'\n"
+           filename;
+         exit 1
+      );
+    | _ -> None in
   let disk_bus =
     match run_template ~verbose filename "disk-bus" [] with
     | Some [answer] -> Some answer
@@ -122,8 +143,31 @@ let probe ?(verbose = false) filename =
     | Some [answer] -> Some answer
     | _ -> None in
 
+  let has_xml_target = run_template ~verbose filename "xml" [] <> None in
+
+  let needs_external_kernel =
+    match run_template ~verbose filename "needs-external-kernel" [] with
+    | None -> false
+    | Some ["1"|"yes"] -> true
+    | Some _ -> false in
+
+  let cmdline =
+    match run_template ~verbose filename "cmdline" [] with
+    | Some [cmdline] -> Some cmdline
+    | _ -> None in
+
+  if not needs_external_kernel && cmdline <> None then (
+    eprintf "mclu: template cannot set 'cmdline' unless 'needs-external-kernel' is 'yes'.\n";
+    exit 1
+  );
+
   { base_image = base_image;
+    guest_arch = guest_arch;
     minimum_memory = minimum_memory;
     recommended_memory = recommended_memory;
+    minimum_size = minimum_size;
     disk_bus = disk_bus;
-    network_model = network_model }
+    network_model = network_model;
+    has_xml_target = has_xml_target;
+    needs_external_kernel = needs_external_kernel;
+    cmdline = cmdline }