--- v2v/OVF.ml | 173 +++++++++++++++++++++++++------------------------- v2v/output_libvirt.ml | 16 +++-- 2 files changed, 100 insertions(+), 89 deletions(-) diff --git a/v2v/OVF.ml b/v2v/OVF.ml index ec835e5..97b2928 100644 --- a/v2v/OVF.ml +++ b/v2v/OVF.ml @@ -274,76 +274,77 @@ let rec create_ovf source targets guestcaps inspect e "Info" [] [PCData "List of Virtual Disks"] ]; - e "Content" ["ovf:id", "out"; "xsi:type", "ovf:VirtualSystem_Type"] ( - let es = [ - e "Name" [] [PCData source.s_name]; - e "TemplateId" [] [PCData "00000000-0000-0000-0000-000000000000"]; - e "TemplateName" [] [PCData "Blank"]; - e "Description" [] [PCData generated_by]; - e "Domain" [] []; - e "CreationDate" [] [PCData iso_time]; - e "IsInitilized" (* sic *) [] [PCData "True"]; - e "IsAutoSuspend" [] [PCData "False"]; - e "TimeZone" [] []; - e "IsStateless" [] [PCData "False"]; - e "VmType" [] [PCData vmtype]; - (* See https://bugzilla.redhat.com/show_bug.cgi?id=1260590#c17 *) - e "DefaultDisplayType" [] [PCData "1"]; - ] in + let content_subnodes = ref [ + e "Name" [] [PCData source.s_name]; + e "TemplateId" [] [PCData "00000000-0000-0000-0000-000000000000"]; + e "TemplateName" [] [PCData "Blank"]; + e "Description" [] [PCData generated_by]; + e "Domain" [] []; + e "CreationDate" [] [PCData iso_time]; + e "IsInitilized" (* sic *) [] [PCData "True"]; + e "IsAutoSuspend" [] [PCData "False"]; + e "TimeZone" [] []; + e "IsStateless" [] [PCData "False"]; + e "VmType" [] [PCData vmtype]; + (* See https://bugzilla.redhat.com/show_bug.cgi?id=1260590#c17 *) + e "DefaultDisplayType" [] [PCData "1"]; + ] in - (* Add the <Origin/> element if we can. *) - let es = - match origin_of_source_hypervisor source.s_hypervisor with - | None -> es - | Some origin -> - es @ [e "Origin" [] [PCData (string_of_int origin)]] in + (* Add the <Origin/> element if we can. *) + (match origin_of_source_hypervisor source.s_hypervisor with + | None -> () + | Some origin -> + push content_subnodes (e "Origin" [] [PCData (string_of_int origin)]) + ); - es @ [ - e "Section" ["ovf:id", vm_uuid; "ovf:required", "false"; - "xsi:type", "ovf:OperatingSystemSection_Type"] [ - e "Info" [] [PCData inspect.i_product_name]; - e "Description" [] [PCData ostype]; - ]; + append content_subnodes [ + e "Section" ["ovf:id", vm_uuid; "ovf:required", "false"; + "xsi:type", "ovf:OperatingSystemSection_Type"] [ + e "Info" [] [PCData inspect.i_product_name]; + e "Description" [] [PCData ostype]; + ]; - e "Section" ["xsi:type", "ovf:VirtualHardwareSection_Type"] [ - e "Info" [] [PCData (sprintf "%d CPU, %Ld Memory" source.s_vcpu memsize_mb)]; - e "Item" [] [ - e "rasd:Caption" [] [PCData (sprintf "%d virtual cpu" source.s_vcpu)]; - e "rasd:Description" [] [PCData "Number of virtual CPU"]; - e "rasd:InstanceId" [] [PCData "1"]; - e "rasd:ResourceType" [] [PCData "3"]; - e "rasd:num_of_sockets" [] [PCData (string_of_int source.s_vcpu)]; - e "rasd:cpu_per_socket"[] [PCData "1"]; - ]; - e "Item" [] [ - e "rasd:Caption" [] [PCData (sprintf "%Ld MB of memory" memsize_mb)]; - e "rasd:Description" [] [PCData "Memory Size"]; - e "rasd:InstanceId" [] [PCData "2"]; - e "rasd:ResourceType" [] [PCData "4"]; - e "rasd:AllocationUnits" [] [PCData "MegaBytes"]; - e "rasd:VirtualQuantity" [] [PCData (Int64.to_string memsize_mb)]; - ]; - e "Item" [] [ - e "rasd:Caption" [] [PCData "USB Controller"]; - e "rasd:InstanceId" [] [PCData "3"]; - e "rasd:ResourceType" [] [PCData "23"]; - e "rasd:UsbPolicy" [] [PCData "Disabled"]; - ]; - (* We always add a qxl device when outputting to RHEV. - * See RHBZ#1213701 and RHBZ#1211231 for the reasoning - * behind that. - *) - e "Item" [] [ - e "rasd:Caption" [] [PCData "Graphical Controller"]; - e "rasd:InstanceId" [] [PCData (uuidgen ())]; - e "rasd:ResourceType" [] [PCData "20"]; - e "Type" [] [PCData "video"]; - e "rasd:VirtualQuantity" [] [PCData "1"]; - e "rasd:Device" [] [PCData "qxl"]; - ] + e "Section" ["xsi:type", "ovf:VirtualHardwareSection_Type"] [ + e "Info" [] [PCData (sprintf "%d CPU, %Ld Memory" source.s_vcpu memsize_mb)]; + e "Item" [] [ + e "rasd:Caption" [] [PCData (sprintf "%d virtual cpu" source.s_vcpu)]; + e "rasd:Description" [] [PCData "Number of virtual CPU"]; + e "rasd:InstanceId" [] [PCData "1"]; + e "rasd:ResourceType" [] [PCData "3"]; + e "rasd:num_of_sockets" [] [PCData (string_of_int source.s_vcpu)]; + e "rasd:cpu_per_socket"[] [PCData "1"]; + ]; + e "Item" [] [ + e "rasd:Caption" [] [PCData (sprintf "%Ld MB of memory" memsize_mb)]; + e "rasd:Description" [] [PCData "Memory Size"]; + e "rasd:InstanceId" [] [PCData "2"]; + e "rasd:ResourceType" [] [PCData "4"]; + e "rasd:AllocationUnits" [] [PCData "MegaBytes"]; + e "rasd:VirtualQuantity" [] [PCData (Int64.to_string memsize_mb)]; + ]; + e "Item" [] [ + e "rasd:Caption" [] [PCData "USB Controller"]; + e "rasd:InstanceId" [] [PCData "3"]; + e "rasd:ResourceType" [] [PCData "23"]; + e "rasd:UsbPolicy" [] [PCData "Disabled"]; + ]; + (* We always add a qxl device when outputting to RHEV. + * See RHBZ#1213701 and RHBZ#1211231 for the reasoning + * behind that. + *) + e "Item" [] [ + e "rasd:Caption" [] [PCData "Graphical Controller"]; + e "rasd:InstanceId" [] [PCData (uuidgen ())]; + e "rasd:ResourceType" [] [PCData "20"]; + e "Type" [] [PCData "video"]; + e "rasd:VirtualQuantity" [] [PCData "1"]; + e "rasd:Device" [] [PCData "qxl"]; ] ] - ) + ]; + + e "Content" ["ovf:id", "out"; "xsi:type", "ovf:VirtualSystem_Type"] + !content_subnodes ] in (* Add disks to the OVF XML. *) @@ -448,7 +449,7 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = (* Add disk to DiskSection. *) let disk = - let attrs = [ + let attrs = ref [ "ovf:diskId", vol_uuid; "ovf:size", Int64.to_string size_gb; "ovf:fileRef", fileref; @@ -465,12 +466,12 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = "ovf:disk-type", "System"; (* RHBZ#744538 *) "ovf:boot", if is_bootable_drive then "True" else "False"; ] in - let attrs = - match actual_size_gb with - | None -> attrs - | Some actual_size_gb -> - ("ovf:actual_size", Int64.to_string actual_size_gb) :: attrs in - e "Disk" attrs [] in + (match actual_size_gb with + | None -> () + | Some actual_size_gb -> + push attrs ("ovf:actual_size", Int64.to_string actual_size_gb) + ); + e "Disk" !attrs [] in if is_estimate then ( let comment = Comment "note: actual_size field is estimated" in append_child comment disk_section @@ -483,7 +484,7 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = * will not parse. *) let caption = sprintf "Drive %d" (i+1) in - e "Item" [] ([ + let item_subnodes = ref [ e "rasd:Caption" [] [PCData caption]; e "rasd:InstanceId" [] [PCData vol_uuid]; e "rasd:ResourceType" [] [PCData "17"]; @@ -497,12 +498,12 @@ and add_disks targets guestcaps output_alloc sd_uuid image_uuids vol_uuids ovf = e "rasd:CreationDate" [] [PCData iso_time]; e "rasd:LastModified" [] [PCData iso_time]; e "rasd:last_modified_date" [] [PCData iso_time]; - ] @ - if is_bootable_drive then - [e "BootOrder" [] [PCData (string_of_int boot_order)]] - else - [] - ) in + ] in + if is_bootable_drive then + push item_subnodes + (e "BootOrder" [] [PCData (string_of_int boot_order)]); + + e "Item" [] !item_subnodes in append_child item virtualhardware_section; ) (combine3 targets image_uuids vol_uuids) @@ -543,7 +544,7 @@ and add_networks nics guestcaps ovf = append_child network network_section; let item = - let children = [ + let item_subnodes = ref [ e "rasd:InstanceId" [] [PCData (uuidgen ())]; e "rasd:Caption" [] [PCData (sprintf "Ethernet adapter on %s" vnet)]; e "rasd:ResourceType" [] [PCData "10"]; @@ -552,11 +553,13 @@ and add_networks nics guestcaps ovf = e "rasd:Connection" [] [PCData vnet]; e "rasd:Name" [] [PCData dev]; ] in - let children = - match mac with - | None -> children - | Some mac -> children @ [e "rasd:MACAddress" [] [PCData mac]] in - e "Item" [] children in + (match mac with + | None -> () + | Some mac -> + push item_subnodes + (e "rasd:MACAddress" [] [PCData mac]) + ); + e "Item" [] !item_subnodes in append_child item virtualhardware_section; ) nics diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml index 69cdd2b..750c64d 100644 --- a/v2v/output_libvirt.ml +++ b/v2v/output_libvirt.ml @@ -125,6 +125,9 @@ let create_libvirt_xml ?pool source target_buses guestcaps (e "type" ["arch", guestcaps.gcaps_arch] [PCData "hvm"]) :: loader in + (* The devices. *) + let devices = ref [] in + (* Fixed and removable disks. *) let disks = let make_disk bus_name drive_prefix i = function @@ -189,6 +192,7 @@ let create_libvirt_xml ?pool source target_buses guestcaps (Array.mapi (make_disk "floppy" "fd") target_buses.target_floppy_bus) ] in + append devices disks; let nics = let net_model = @@ -221,6 +225,7 @@ let create_libvirt_xml ?pool source target_buses guestcaps nic ) source.s_nics in + append devices nics; (* Same as old virt-v2v, we always add a display here even if it was * missing from the old metadata. @@ -232,6 +237,7 @@ let create_libvirt_xml ?pool source target_buses guestcaps | Cirrus -> e "model" [ "type", "cirrus"; "vram", "9216" ] [] in append_attr ("heads", "1") video_model; e "video" [] [ video_model ] in + push devices video; let graphics = match source.s_display with @@ -267,6 +273,7 @@ let create_libvirt_xml ?pool source target_buses guestcaps | Some { s_port = None } | None -> append_attr ("autoport", "yes") graphics; append_attr ("port", "-1") graphics); + push devices graphics; let sound = match source.s_sound with @@ -276,13 +283,14 @@ let create_libvirt_xml ?pool source target_buses guestcaps [ e "sound" [ "model", string_of_source_sound_model model ] [] ] else [] in + append devices sound; - let devices = disks @ nics @ [video] @ [graphics] @ sound @ - (* Standard devices added to every guest. *) [ + (* Standard devices added to every guest. *) + append devices [ e "input" ["type", "tablet"; "bus", "usb"] []; e "input" ["type", "mouse"; "bus", "ps2"] []; e "console" ["type", "pty"] []; - ] in + ]; let doc : doc = doc "domain" [ @@ -300,7 +308,7 @@ let create_libvirt_xml ?pool source target_buses guestcaps e "on_reboot" [] [PCData "restart"]; e "on_crash" [] [PCData "restart"]; - e "devices" [] devices; + e "devices" [] !devices; ] in doc -- 2.7.4