Richard W.M. Jones
2022-Apr-11 10:11 UTC
[Libguestfs] [PATCH v2v 0/2] output: Remove -o json mode [in stages]
I'd like to remove the unused -o json mode. The implementation is over-complicated and the only potential user (KubeVirt) isn't using it now and would be better off with a proper -o kubevirt mode, which I'm going to implement later. My plan would be to add the patches in two stages. The first patch, which only removes the documentation but leaves the feature and test, would be applied to stable branch virt-v2v 2.0. The second patch would be go on the development branch 2.1 (which hasn't yet been created). The first stable release without this feature would be 2.2. For RHEL I'd probably put both patches in 9.1, even though we're planning to ship virt-v2v 2.0.x there. It means there will be an option/feature present in RHEL 9.0 which is removed in 9.1. Rich.
Richard W.M. Jones
2022-Apr-11 10:11 UTC
[Libguestfs] [PATCH v2v 1/2] docs: Remove documentation for -o json in preparation for removal
I would like to remove the -o json option in virt-v2v 2.2. It was added to support KubeVirt, but never actually used. It is better for specific targets to implement a proper output mode (as we will eventually do for KubeVirt) rather than relying on a custom templating language which knows nothing about the target. This preparatory patch removes only the documentation, although it leaves a note in the main manual page that the feature existed and is deprecated. --- docs/virt-v2v-output-local.pod | 55 ---------------------------------- docs/virt-v2v.pod | 11 ++----- 2 files changed, 2 insertions(+), 64 deletions(-) diff --git a/docs/virt-v2v-output-local.pod b/docs/virt-v2v-output-local.pod index a5f155cbc4..d2a1c2702a 100644 --- a/docs/virt-v2v-output-local.pod +++ b/docs/virt-v2v-output-local.pod @@ -11,9 +11,6 @@ or libvirt virt-v2v [-i* options] -o qemu -os DIRECTORY [--qemu-boot] - virt-v2v [-i* options] -o json -os DIRECTORY - [-oo json-disks-pattern=PATTERN] - virt-v2v [-i* options] -o null =head1 DESCRIPTION @@ -57,13 +54,6 @@ above, a shell script is created which contains the raw qemu command you would need to boot the guest. However the shell script is not run, I<unless> you also add the I<--qemu-boot> option. -=item B<-o json -os> C<DIRECTORY> - -This converts the guest to files in C<DIRECTORY>. The metadata -produced is a JSON file containing the majority of the data virt-v2v -gathers during the conversion. -See L</OUTPUT TO JSON> below. - =item B<-o null> The guest is converted, but the final result is thrown away and no @@ -150,51 +140,6 @@ Define the final guest in libvirt: =back -=head1 OUTPUT TO JSON - -The I<-o json> option produces the following files by default: - - NAME.json JSON metadata. - NAME-sda, NAME-sdb, etc. Guest disk(s). - -where C<NAME> is the guest name. - -It is possible to change the pattern of the disks using the -I<-oo json-disks-pattern=...> option: it allows parameters in form of -C<%{...}> variables, for example: - - -oo json-disks-pattern=disk%{DiskNo}.img - -Recognized variables are: - -=over 4 - -=item C<%{DiskNo}> - -The index of the disk, starting from 1. - -=item C<%{DiskDeviceName}> - -The destination device of the disk, e.g. C<sda>, C<sdb>, etc. - -=item C<%{GuestName}> - -The name of the guest. - -=back - -Using a pattern it is possible use subdirectories for the disks, -even with names depending on variables; for example: - - -oo json-disks-pattern=%{GuestName}-%{DiskNo}/disk.img - -The default pattern is C<%{GuestName}-%{DiskDeviceName}>. - -If the literal C<%{...}> text is needed, it is possible to avoid the -escape it with a leading C<%>; for example, -C<%%{GuestName}-%{DiskNo}.img> will create file names for the -disks like C<%%{GuestName}-1.img>, C<%%{GuestName}-2.img>, etc. - =head1 SEE ALSO L<virt-v2v(1)>. diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod index 69bdbbd462..4e912b6c16 100644 --- a/docs/virt-v2v.pod +++ b/docs/virt-v2v.pod @@ -431,14 +431,7 @@ guest is uploaded to Glance. See L<virt-v2v-output-openstack(1)>. =item B<-o> B<json> -Set the output method to I<json>. - -In this mode, the converted guest is written to a local directory -specified by I<-os /dir> (the directory must exist), with a JSON file -containing the majority of the metadata that virt-v2v gathered during -the conversion. - -See L<virt-v2v-output-local(1)>. +This option is deprecated and will be removed in S<virt-v2v 2.2>. =item B<-o> B<libvirt> @@ -719,7 +712,7 @@ The location of the storage for the converted guest. For I<-o libvirt>, this is a libvirt directory pool (see S<C<virsh pool-list>>) or pool UUID. -For I<-o json>, I<-o local> and I<-o qemu>, this is a directory name. +For I<-o local> and I<-o qemu>, this is a directory name. The directory must exist. For I<-o rhv-upload>, this is the name of the destination Storage -- 2.35.1
Richard W.M. Jones
2022-Apr-11 10:11 UTC
[Libguestfs] [PATCH v2v 2/2] output: Remove -o json mode
This removes the -o json mode completely. --- docs/virt-v2v.pod | 4 - output/Makefile.am | 51 +----- output/create_json.ml | 338 ----------------------------------- output/create_json.mli | 27 --- output/output_json.ml | 153 ---------------- output/output_json.mli | 21 --- output/var_expander.ml | 72 -------- output/var_expander.mli | 82 --------- output/var_expander_tests.ml | 113 ------------ tests/Makefile.am | 2 - tests/test-v2v-o-json.sh | 68 ------- v2v/v2v.ml | 7 +- 12 files changed, 5 insertions(+), 933 deletions(-) diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod index 4e912b6c16..d627734b0d 100644 --- a/docs/virt-v2v.pod +++ b/docs/virt-v2v.pod @@ -429,10 +429,6 @@ instead. Set the output method to OpenStack Glance. In this mode the converted guest is uploaded to Glance. See L<virt-v2v-output-openstack(1)>. -=item B<-o> B<json> - -This option is deprecated and will be removed in S<virt-v2v 2.2>. - =item B<-o> B<libvirt> Set the output method to I<libvirt>. This is the default. diff --git a/output/Makefile.am b/output/Makefile.am index 61caf68be1..dd488549db 100644 --- a/output/Makefile.am +++ b/output/Makefile.am @@ -39,18 +39,15 @@ EXTRA_DIST = \ rhv-upload-precheck.py \ rhv-upload-transfer.py \ rhv-upload-vmcheck.py \ - test-v2v-python-syntax.sh \ - var_expander_tests.ml + test-v2v-python-syntax.sh SOURCES_MLI = \ changeuid.mli \ - create_json.mli \ create_libvirt_xml.mli \ openstack_image_properties.mli \ output.mli \ output_disk.mli \ output_glance.mli \ - output_json.mli \ output_libvirt.mli \ output_null.mli \ output_openstack.mli \ @@ -66,14 +63,11 @@ SOURCES_MLI = \ output_rhv_upload_transfer_source.mli \ output_rhv_upload_vmcheck_source.mli \ python_script.mli \ - qemuopts.mli \ - var_expander.mli + qemuopts.mli SOURCES_ML = \ changeuid.ml \ python_script.ml \ - var_expander.ml \ - create_json.ml \ create_libvirt_xml.ml \ qemuopts.ml \ openstack_image_properties.ml \ @@ -87,7 +81,6 @@ SOURCES_ML = \ output.ml \ output_disk.ml \ output_glance.ml \ - output_json.ml \ output_libvirt.ml \ output_null.ml \ output_openstack.ml \ @@ -203,47 +196,9 @@ $(MLOUTPUT_CMA): $(OBJECTS) libmloutput.a $(OCAMLFIND) mklib $(OCAMLPACKAGES) \ $(OBJECTS) $(libmloutput_a_OBJECTS) -o mloutput -# Unit tests. -TESTS -if HAVE_OCAML_PKG_OUNIT -TESTS += \ - var_expander_tests -check_PROGRAMS = \ - var_expander_tests -endif - -var_expander_tests_BOBJECTS = \ - var_expander.cmo \ - var_expander_tests.cmo -var_expander_tests_XOBJECTS = $(var_expander_tests_BOBJECTS:.cmo=.cmx) - -var_expander_tests_SOURCES = dummy.c -var_expander_tests_CPPFLAGS = $(virt_v2v_CPPFLAGS) -var_expander_tests_CFLAGS = $(virt_v2v_CFLAGS) - -if !HAVE_OCAMLOPT -# Can't call this var_expander_tests_OBJECTS because automake gets confused. -var_expander_tests_THEOBJECTS = $(var_expander_tests_BOBJECTS) -var_expander_tests.cmo: OCAMLPACKAGES += -package ounit2 -else -var_expander_tests_THEOBJECTS = $(var_expander_tests_XOBJECTS) -var_expander_tests.cmx: OCAMLPACKAGES += -package ounit2 -endif - -var_expander_tests_DEPENDENCIES = \ - $(var_expander_tests_THEOBJECTS) \ - $(top_builddir)/common/mlpcre/mlpcre.$(MLARCHIVE) \ - $(top_srcdir)/ocaml-link.sh -var_expander_tests_LINK = \ - $(top_srcdir)/ocaml-link.sh -cclib '$(OCAMLCLIBS)' -- \ - $(OCAMLFIND) $(BEST) $(OCAMLFLAGS) \ - $(OCAMLPACKAGES) -package ounit2 \ - $(OCAMLLINKFLAGS) \ - $(var_expander_tests_THEOBJECTS) -o $@ - # Unit tests. TESTS_ENVIRONMENT = $(top_builddir)/run --test -TESTS += test-v2v-python-syntax.sh +TESTS = test-v2v-python-syntax.sh # Dependencies. .depend: \ diff --git a/output/create_json.ml b/output/create_json.ml deleted file mode 100644 index cbc27fdc62..0000000000 --- a/output/create_json.ml +++ /dev/null @@ -1,338 +0,0 @@ -(* virt-v2v - * Copyright (C) 2019 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -open Std_utils -open C_utils -open Tools_utils - -open Types -open Utils - -module G = Guestfs - -let json_list_of_string_list - List.map (fun x -> JSON.String x) - -let json_list_of_string_string_list - List.map (fun (x, y) -> x, JSON.String y) - -let push_optional_string lst name = function - | None -> () - | Some v -> List.push_back lst (name, JSON.String v) - -let push_optional_int lst name = function - | None -> () - | Some v -> List.push_back lst (name, JSON.Int (Int64.of_int v)) - -let json_unknown_string = function - | "unknown" -> JSON.Null - | v -> JSON.String v - -let create_json_metadata source inspect - { guestcaps; target_buses; target_firmware; target_nics } - outdisk_name output_format output_name - let doc = ref [ - "version", JSON.Int 1L; - "name", JSON.String output_name; - "memory", JSON.Int source.s_memory; - "vcpu", JSON.Int (Int64.of_int source.s_vcpu); - ] in - - (match source.s_genid with - | None -> () - | Some genid -> List.push_back doc ("genid", JSON.String genid) - ); - - if source.s_cpu_vendor <> None || source.s_cpu_model <> None || - source.s_cpu_topology <> None then ( - let cpu = ref [] in - - push_optional_string cpu "vendor" source.s_cpu_vendor; - push_optional_string cpu "model" source.s_cpu_model; - (match source.s_cpu_topology with - | None -> () - | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } -> - let attrs = [ - "sockets", JSON.Int (Int64.of_int s_cpu_sockets); - "cores", JSON.Int (Int64.of_int s_cpu_cores); - "threads", JSON.Int (Int64.of_int s_cpu_threads); - ] in - List.push_back cpu ("topology", JSON.Dict attrs) - ); - - List.push_back doc ("cpu", JSON.Dict !cpu); - ); - - let firmware - let firmware_type - match target_firmware with - | TargetBIOS -> "bios" - | TargetUEFI -> "uefi" in - - let fw = ref [ - "type", JSON.String firmware_type; - ] in - - (match target_firmware with - | TargetBIOS -> () - | TargetUEFI -> - let uefi_firmware = find_uefi_firmware guestcaps.gcaps_arch in - let flags - List.map ( - function - | Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED -> "secure_boot_required" - ) uefi_firmware.Uefi.flags in - - let uefi = ref [ - "code", JSON.String uefi_firmware.Uefi.code; - "vars", JSON.String uefi_firmware.Uefi.vars; - "flags", JSON.List (json_list_of_string_list flags); - ] in - - push_optional_string uefi "code-debug" uefi_firmware.Uefi.code_debug; - - List.push_back fw ("uefi", JSON.Dict !uefi) - ); - - !fw in - List.push_back doc ("firmware", JSON.Dict firmware); - - List.push_back doc ("features", - JSON.List (json_list_of_string_list source.s_features)); - - let machine - match guestcaps.gcaps_machine with - | I440FX -> "pc" - | Q35 -> "q35" - | Virt -> "virt" in - List.push_back doc ("machine", JSON.String machine); - - let disks, removables - let disks = ref [] - and removables = ref [] in - - let iter_bus bus_name drive_prefix i = function - | BusSlotEmpty -> () - | BusSlotDisk d -> - (* Find the corresponding target disk. *) - let outdisk = outdisk_name d.s_disk_id in - - let disk = [ - "dev", JSON.String (drive_prefix ^ drive_name i); - "bus", JSON.String bus_name; - "format", JSON.String output_format; - "file", JSON.String outdisk; - ] in - - List.push_back disks (JSON.Dict disk) - - | BusSlotRemovable { s_removable_type = CDROM } -> - let cdrom = [ - "type", JSON.String "cdrom"; - "dev", JSON.String (drive_prefix ^ drive_name i); - "bus", JSON.String bus_name; - ] in - - List.push_back removables (JSON.Dict cdrom) - - | BusSlotRemovable { s_removable_type = Floppy } -> - let floppy = [ - "type", JSON.String "floppy"; - "dev", JSON.String (drive_prefix ^ drive_name i); - ] in - - List.push_back removables (JSON.Dict floppy) - in - - Array.iteri (iter_bus "virtio" "vd") target_buses.target_virtio_blk_bus; - Array.iteri (iter_bus "ide" "hd") target_buses.target_ide_bus; - Array.iteri (iter_bus "scsi" "sd") target_buses.target_scsi_bus; - Array.iteri (iter_bus "floppy" "fd") target_buses.target_floppy_bus; - - !disks, !removables in - List.push_back doc ("disks", JSON.List disks); - List.push_back doc ("removables", JSON.List removables); - - let nics - List.map ( - fun { s_mac = mac; s_vnet_type = vnet_type; s_nic_model = nic_model; - s_vnet = vnet; } -> - let vnet_type_str - match vnet_type with - | Bridge -> "bridge" - | Network -> "network" in - - let nic = ref [ - "vnet", JSON.String vnet; - "vnet-type", JSON.String vnet_type_str; - ] in - - let nic_model_str = Option.map string_of_nic_model nic_model in - push_optional_string nic "model" nic_model_str; - - push_optional_string nic "mac" mac; - - JSON.Dict !nic - ) target_nics in - List.push_back doc ("nics", JSON.List nics); - - let guestcaps_dict - let block_bus - match guestcaps.gcaps_block_bus with - | Virtio_blk -> "virtio-blk" - | IDE -> "ide" in - let net_bus - match guestcaps.gcaps_net_bus with - | Virtio_net -> "virtio-net" - | E1000 -> "e1000" - | RTL8139 -> "rtl8139" in - let video = "vga" in - let machine - match guestcaps.gcaps_machine with - | I440FX -> "i440fx" - | Q35 -> "q35" - | Virt -> "virt" in - - [ - "block-bus", JSON.String block_bus; - "net-bus", JSON.String net_bus; - "video", JSON.String video; - "machine", JSON.String machine; - "arch", JSON.String guestcaps.gcaps_arch; - "virtio-rng", JSON.Bool guestcaps.gcaps_virtio_rng; - "virtio-balloon", JSON.Bool guestcaps.gcaps_virtio_balloon; - "isa-pvpanic", JSON.Bool guestcaps.gcaps_isa_pvpanic; - "virtio-socket", JSON.Bool guestcaps.gcaps_virtio_socket; - "acpi", JSON.Bool guestcaps.gcaps_acpi; - "virtio-1-0", JSON.Bool guestcaps.gcaps_virtio_1_0; - ] in - List.push_back doc ("guestcaps", JSON.Dict guestcaps_dict); - - (match source.s_sound with - | None -> () - | Some { s_sound_model = model } -> - let sound = [ - "model", JSON.String (string_of_source_sound_model model); - ] in - List.push_back doc ("sound", JSON.Dict sound) - ); - - (match source.s_display with - | None -> () - | Some d -> - let display_type - match d.s_display_type with - | Window -> "window" - | VNC -> "vnc" - | Spice -> "spice" in - - let display = ref [ - "type", JSON.String display_type; - ] in - - push_optional_string display "keymap" d.s_keymap; - push_optional_string display "password" d.s_password; - - let listen - match d.s_listen with - | LNoListen -> None - | LAddress address -> - Some [ - "type", JSON.String "address"; - "address", JSON.String address; - ] - | LNetwork network -> - Some [ - "type", JSON.String "network"; - "network", JSON.String network; - ] - | LSocket None -> - Some [ - "type", JSON.String "socket"; - "socket", JSON.Null; - ] - | LSocket (Some socket) -> - Some [ - "type", JSON.String "socket"; - "socket", JSON.String socket; - ] - | LNone -> - Some [ - "type", JSON.String "none"; - ] in - (match listen with - | None -> () - | Some l -> List.push_back display ("listen", JSON.Dict l) - ); - - push_optional_int display "port" d.s_port; - - List.push_back doc ("display", JSON.Dict !display) - ); - - let inspect_dict - let apps - List.map ( - fun { G.app2_name = name; app2_display_name = display_name; - app2_epoch = epoch; app2_version = version; - app2_release = release; app2_arch = arch; } -> - JSON.Dict [ - "name", JSON.String name; - "display-name", JSON.String display_name; - "epoch", JSON.Int (Int64.of_int32 epoch); - "version", JSON.String version; - "release", JSON.String release; - "arch", JSON.String arch; - ] - ) inspect.i_apps in - - let firmware_dict - match inspect.i_firmware with - | I_BIOS -> - [ - "type", JSON.String "bios"; - ] - | I_UEFI devices -> - [ - "type", JSON.String "uefi"; - "devices", JSON.List (json_list_of_string_list devices); - ] in - - [ - "root", JSON.String inspect.i_root; - "type", JSON.String inspect.i_type; - "distro", json_unknown_string inspect.i_distro; - "osinfo", json_unknown_string inspect.i_osinfo; - "arch", JSON.String inspect.i_arch; - "major-version", JSON.Int (Int64.of_int inspect.i_major_version); - "minor-version", JSON.Int (Int64.of_int inspect.i_minor_version); - "package-format", json_unknown_string inspect.i_package_format; - "package-management", json_unknown_string inspect.i_package_management; - "product-name", json_unknown_string inspect.i_product_name; - "product-variant", json_unknown_string inspect.i_product_variant; - "mountpoints", JSON.Dict (json_list_of_string_string_list inspect.i_mountpoints); - "applications", JSON.List apps; - "windows-systemroot", JSON.String inspect.i_windows_systemroot; - "windows-software-hive", JSON.String inspect.i_windows_software_hive; - "windows-system-hive", JSON.String inspect.i_windows_system_hive; - "windows-current-control-set", JSON.String inspect.i_windows_current_control_set; - "firmware", JSON.Dict firmware_dict; - ] in - List.push_back doc ("inspect", JSON.Dict inspect_dict); - - !doc diff --git a/output/create_json.mli b/output/create_json.mli deleted file mode 100644 index 97086ff566..0000000000 --- a/output/create_json.mli +++ /dev/null @@ -1,27 +0,0 @@ -(* virt-v2v - * Copyright (C) 2019 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -(** Create JSON metadata for [-o json]. *) - -val create_json_metadata : Types.source -> Types.inspect -> - Types.target_meta -> - (int -> string) -> string -> string -> - JSON.doc -(** [create_json_metadata source targets outdisk_map output_format output_name] - creates the JSON with the majority of the data that virt-v2v used for the - conversion. *) diff --git a/output/output_json.ml b/output/output_json.ml deleted file mode 100644 index 6e81b63922..0000000000 --- a/output/output_json.ml +++ /dev/null @@ -1,153 +0,0 @@ -(* virt-v2v - * Copyright (C) 2009-2021 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -open Printf -open Unix - -open C_utils -open Std_utils -open Tools_utils -open Common_gettext.Gettext - -open Types -open Utils - -open Output - -module Json = struct - type poptions = string * Types.output_allocation * string * string * string - - type t = unit - - let to_string options - "-o json" ^ - match options.output_storage with - | Some os -> " -os " ^ os - | None -> "" - - let query_output_options () - printf (f_"Output options (-oo) which can be used with -o json: - - -oo json-disks-pattern=PATTERN Pattern for the disks. -") - - let parse_options options source - if options.output_conn <> None then - error_option_cannot_be_used_in_output_mode "json" "-oc"; - if options.output_password <> None then - error_option_cannot_be_used_in_output_mode "json" "-op"; - - let known_pattern_variables = ["DiskNo"; "DiskDeviceName"; "GuestName"] in - let json_disks_pattern = ref None in - List.iter ( - fun (k, v) -> - match k with - | "json-disks-pattern" -> - if !json_disks_pattern <> None then - error (f_"-o json: -oo json-disks-pattern set more than once"); - let vars - try Var_expander.scan_variables v - with Var_expander.Invalid_variable var -> - error (f_"-o json: -oo json-disks-pattern: invalid variable %%{%s}") - var in - List.iter ( - fun var -> - if not (List.mem var known_pattern_variables) then - error (f_"-o json: -oo json-disks-pattern: unhandled variable %%{%s}") - var - ) vars; - json_disks_pattern := Some v - | k -> - error (f_"-o json: unknown output option ?-oo %s?") k - ) options.output_options; - - let json_disks_pattern - Option.default "%{GuestName}-%{DiskDeviceName}" !json_disks_pattern in - - (* -os must be set to a directory. *) - let output_storage - match options.output_storage with - | None -> - error (f_"-o json: output directory was not specified, use '-os /dir'") - | Some d when not (is_directory d) -> - error (f_"-os %s: output directory does not exist or is not a directory") d - | Some d -> d in - - let output_name = Option.default source.s_name options.output_name in - - (json_disks_pattern, - options.output_alloc, options.output_format, output_name, output_storage) - - let rec setup dir options source - let disks = get_disks dir in - let json_disks_pattern, - output_alloc, output_format, output_name, - output_storage = options in - - List.iter ( - fun (i, size) -> - let socket = sprintf "%s/out%d" dir i in - On_exit.unlink socket; - - (* Create the actual output disk. *) - let outdisk = json_path output_storage output_name - json_disks_pattern i in - mkdir_p (Filename.dirname outdisk) 0o755; - - output_to_local_file output_alloc output_format outdisk size socket - ) disks - - (* For -o json, return the output disk name of the i'th disk. *) - and json_path os output_name json_disks_pattern i - let outname - let vars_fn = function - | "DiskNo" -> Some (string_of_int (i+1)) - | "DiskDeviceName" -> Some (sprintf "sd%s" (drive_name i)) - | "GuestName" -> Some output_name - | _ -> assert false - in - Var_expander.replace_fn json_disks_pattern vars_fn in - let outdisk = os // outname in - let outdisk = absolute_path outdisk in - outdisk - - let finalize dir options () source inspect target_meta - let json_disks_pattern, - output_alloc, output_format, output_name, output_storage = options in - - let doc - Create_json.create_json_metadata source inspect target_meta - (json_path output_storage output_name json_disks_pattern) - output_format output_name in - let doc_string = JSON.string_of_doc ~fmt:JSON.Indented doc in - - if verbose () then ( - eprintf "resulting JSON:\n"; - output_string Stdlib.stderr doc_string; - eprintf "\n\n%!"; - ); - - let file = output_storage // output_name ^ ".json" in - with_open_out file ( - fun chan -> - output_string chan doc_string; - output_char chan '\n' - ) - - let request_size = None -end diff --git a/output/output_json.mli b/output/output_json.mli deleted file mode 100644 index 00786ef714..0000000000 --- a/output/output_json.mli +++ /dev/null @@ -1,21 +0,0 @@ -(* virt-v2v - * Copyright (C) 2009-2021 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -(** [-o json] output mode. *) - -module Json : Output.OUTPUT diff --git a/output/var_expander.ml b/output/var_expander.ml deleted file mode 100644 index 24b9bafe37..0000000000 --- a/output/var_expander.ml +++ /dev/null @@ -1,72 +0,0 @@ -(* virt-v2v - * Copyright (C) 2019 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -open Std_utils - -exception Invalid_variable of string - -let var_re = PCRE.compile "(^|[^%])%{([^}]+)}" - -let check_variable var - String.iter ( - function - | '0'..'9' - | 'a'..'z' - | 'A'..'Z' - | '_' - | '-' -> () - | _ -> raise (Invalid_variable var) - ) var - -let scan_variables str - let res = ref [] in - let offset = ref 0 in - while PCRE.matches ~offset:!offset var_re str; do - let var = PCRE.sub 2 in - check_variable var; - let _, end_ = PCRE.subi 0 in - List.push_back res var; - offset := end_ - done; - List.remove_duplicates !res - -let replace_fn str fn - let res = ref str in - let offset = ref 0 in - while PCRE.matches ~offset:!offset var_re !res; do - let var = PCRE.sub 2 in - check_variable var; - let start_, end_ = PCRE.subi 0 in - match fn var with - | None -> - offset := end_ - | Some text -> - let prefix_len - let prefix_start, prefix_end = PCRE.subi 1 in - prefix_end - prefix_start in - res := (String.sub !res 0 (start_ + prefix_len)) ^ text ^ (String.sub !res end_ (String.length !res - end_)); - offset := start_ + prefix_len + String.length text - done; - !res - -let replace_list str lst - let fn var - try Some (List.assoc var lst) - with Not_found -> None - in - replace_fn str fn diff --git a/output/var_expander.mli b/output/var_expander.mli deleted file mode 100644 index 80aa33c2c5..0000000000 --- a/output/var_expander.mli +++ /dev/null @@ -1,82 +0,0 @@ -(* virt-v2v - * Copyright (C) 2019 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -(** Simple variable expander. - - This module provides the support to expand variables in strings, - specified in the form of [%{name}]. - - For example: - -{v -let str = "variable-%{INDEX} in %{INDEX} replaced %{INDEX} times" -let index = ref 0 -let fn = function - | "INDEX" -> - incr index; - Some (string_of_int !index) - | _ -> None -in -let str = Var_expander.replace_fn str fn -(* now str is "variable-1 in 2 replaced 3 times" *) -v} - - The names of variables can contain only ASCII letters (uppercase, - and lowercase), digits, underscores, and dashes. - - The replacement is done in a single pass: this means that if a - variable is replaced with the text of a variable, that new text - is kept as is in the final output. In practice: - -{v -let str = "%{VAR}" -let str = Var_expander.replace_list str [("VAR", "%{VAR}")] -(* now str is "%{VAR}" *) -v} -*) - -exception Invalid_variable of string -(** Invalid variable name error. - - In case a variable contains characters not allowed, then this - exception with the actual unacceptable variable. *) - -val scan_variables : string -> string list -(** Scan the pattern string for all the variables available. - - This can raise {!Invalid_variable} in case there are invalid - variable names. *) - -val replace_fn : string -> (string -> string option) -> string -(** Replaces a string expanding all the variables. - - The replacement function specify how a variable is replaced; - if [None] is returned, then that variable is not replaced. - - This can raise {!Invalid_variable} in case there are invalid - variable names. *) - -val replace_list : string -> (string * string) list -> string -(** Replaces a string expanding all the variables. - - The replacement list specify how a variable is replaced; - if it is not specified in the list, then that variable is not - replaced. - - This can raise {!Invalid_variable} in case there are invalid - variable names. *) diff --git a/output/var_expander_tests.ml b/output/var_expander_tests.ml deleted file mode 100644 index 35b628369a..0000000000 --- a/output/var_expander_tests.ml +++ /dev/null @@ -1,113 +0,0 @@ -(* virt-v2v - * Copyright (C) 2019 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -open Printf -open OUnit - -open Std_utils - -let assert_equal_string = assert_equal ~printer:identity -let assert_equal_stringlist = assert_equal ~printer:(fun x -> "(" ^ (String.escaped (String.concat "," x)) ^ ")") - -let replace_none_fn _ = None -let replace_empty_fn _ = Some "" - -let test_no_replacement () - assert_equal_string "" (Var_expander.replace_fn "" replace_none_fn); - assert_equal_string "x" (Var_expander.replace_fn "x" replace_none_fn); - assert_equal_string "%{}" (Var_expander.replace_fn "%{}" replace_none_fn); - assert_equal_string "%{EMPTY}" (Var_expander.replace_fn "%{EMPTY}" replace_none_fn); - assert_equal_string "%{EMPTY} %{no}" (Var_expander.replace_fn "%{EMPTY} %{no}" replace_none_fn); - assert_equal_string "a %{EMPTY} b" (Var_expander.replace_fn "a %{EMPTY} b" replace_none_fn); - () - -let test_replacements () - assert_equal_string "" (Var_expander.replace_fn "%{EMPTY}" replace_empty_fn); - assert_equal_string "x " (Var_expander.replace_fn "x %{EMPTY}" replace_empty_fn); - assert_equal_string "xy" (Var_expander.replace_fn "x%{EMPTY}y" replace_empty_fn); - assert_equal_string "x<->y" (Var_expander.replace_fn "x%{FOO}y" (function | "FOO" -> Some "<->" | _ -> None)); - assert_equal_string "a x b" (Var_expander.replace_fn "a %{FOO} b" (function | "FOO" -> Some "x" | _ -> None)); - assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{FOO} %{BAR}" (function | "BAR" -> Some "x" | _ -> None)); - assert_equal_string "%{FOO}" (Var_expander.replace_fn "%{BAR}" (function | "BAR" -> Some "%{FOO}" | _ -> None)); - assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{BAR} %{FOO}" (function | "BAR" -> Some "%{FOO}" | "FOO" -> Some "x" | _ -> None)); - begin - let str = "%{INDEX}, %{INDEX}, %{INDEX}" in - let index = ref 0 in - let fn = function - | "INDEX" -> - incr index; - Some (string_of_int !index) - | _ -> None - in - assert_equal_string "1, 2, 3" (Var_expander.replace_fn str fn) - end; - () - -let test_escape () - assert_equal_string "%%{FOO}" (Var_expander.replace_fn "%%{FOO}" replace_empty_fn); - assert_equal_string "x %%{FOO} x" (Var_expander.replace_fn "%{FOO} %%{FOO} %{FOO}" (function | "FOO" -> Some "x" | _ -> None)); - () - -let test_list () - assert_equal_string "x %{NONE}" (Var_expander.replace_list "%{FOO} %{NONE}" [("FOO", "x")]); - () - -let test_scan_variables () - let assert_invalid_variable var - let str = "%{" ^ var ^ "}" in - assert_raises (Var_expander.Invalid_variable var) - (fun () -> Var_expander.scan_variables str) - in - assert_equal_stringlist [] (Var_expander.scan_variables ""); - assert_equal_stringlist [] (Var_expander.scan_variables "foo"); - assert_equal_stringlist ["FOO"] (Var_expander.scan_variables "%{FOO}"); - assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR}"); - assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR} %{FOO}"); - assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %%{ESCAPED} %{BAR}"); - assert_invalid_variable "FOO/BAR"; - () - -let test_errors () - let assert_invalid_variable var - let str = "%{" ^ var ^ "}" in - assert_raises (Var_expander.Invalid_variable var) - (fun () -> Var_expander.replace_fn str replace_none_fn) - in - assert_invalid_variable "FOO/BAR"; - assert_invalid_variable "FOO:BAR"; - assert_invalid_variable "FOO(BAR"; - assert_invalid_variable "FOO)BAR"; - assert_invalid_variable "FOO at BAR"; - () - -(* Suites declaration. *) -let suite - TestList ([ - "basic" >::: [ - "no_replacement" >:: test_no_replacement; - "replacements" >:: test_replacements; - "escape" >:: test_escape; - "list" >:: test_list; - "scan_variables" >:: test_scan_variables; - "errors" >:: test_errors; - ]; - ]) - -let () - ignore (run_test_tt_main suite); - Printf.fprintf stderr "\n" diff --git a/tests/Makefile.am b/tests/Makefile.am index 4b66cb0da8..29afd41576 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -82,7 +82,6 @@ TESTS = \ test-v2v-machine-readable.sh \ test-v2v-networks-and-bridges.sh \ test-v2v-o-glance.sh \ - test-v2v-o-json.sh \ test-v2v-o-libvirt.sh \ test-v2v-o-null.sh \ test-v2v-o-openstack.sh \ @@ -228,7 +227,6 @@ EXTRA_DIST += \ test-v2v-networks-and-bridges.sh \ test-v2v-networks-and-bridges-expected.xml \ test-v2v-o-glance.sh \ - test-v2v-o-json.sh \ test-v2v-o-libvirt.sh \ test-v2v-o-null.sh \ test-v2v-o-openstack.sh \ diff --git a/tests/test-v2v-o-json.sh b/tests/test-v2v-o-json.sh deleted file mode 100755 index 15e7ad5aeb..0000000000 --- a/tests/test-v2v-o-json.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -# libguestfs virt-v2v test script -# Copyright (C) 2019 Red Hat Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -# Test -o json. - -set -e -set -x - -source ./functions.sh -set -e -set -x - -skip_if_skipped -requires test -f ../test-data/phony-guests/windows.img -requires jq --version - -libvirt_uri="test://$abs_top_builddir/test-data/phony-guests/guests.xml" - -export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools" - -guestname=windows - -d=test-v2v-o-json.d -rm -rf $d -cleanup_fn rm -r $d -mkdir $d - -json=$d/$guestname.json -disk=$d/$guestname-sda - -$VG virt-v2v --debug-gc \ - -i libvirt -ic "$libvirt_uri" windows \ - -o json -os $d -on $guestname - -# Test the disk was created. -test -f $disk - -# Test the JSON. -test x$(jq -r '.name' $json) = xwindows -test x$(jq -r '.inspect.type' $json) = xwindows -test x$(jq -r '.inspect.distro' $json) = xwindows -test $(jq -r '.disks | length' $json) -eq 1 -test $(jq -r '.disks[0].file' $json) = $(realpath $disk) -test $(jq -r '.nics | length' $json) -eq 1 -test $(jq -r '.removables | length' $json) -eq 0 - -# libguestfs 1.40 didn't have osinfo inspection data, but we want this -# test to work with 1.40, so ignore if jq returns this field as -# "null". -osinfo=$(jq -r '.inspect.osinfo' $json) -if [ "x$osinfo" != "xnull" ]; then - test x$osinfo = xwin7 -fi diff --git a/v2v/v2v.ml b/v2v/v2v.ml index 9790416efb..6df82cfce9 100644 --- a/v2v/v2v.ml +++ b/v2v/v2v.ml @@ -195,7 +195,6 @@ let rec main () | "glance" -> output_mode := `Glance | "libvirt" -> output_mode := `Libvirt | "disk" | "local" -> output_mode := `Disk - | "json" -> output_mode := `JSON | "null" -> output_mode := `Null | "openstack" | "osp" | "rhosp" -> output_mode := `Openstack | "ovirt" | "rhv" | "rhev" -> output_mode := `RHV @@ -250,7 +249,7 @@ let rec main () s_"Map network ?in? to ?out?"; [ L"no-trim" ], Getopt.String ("-", no_trim_warning), s_"Ignored for backwards compatibility"; - [ S 'o' ], Getopt.String ("glance|json|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), + [ S 'o' ], Getopt.String ("glance|libvirt|local|null|openstack|qemu|rhv|rhv-upload|vdsm", set_output_mode), s_"Set output mode (default: libvirt)"; [ M"oa" ], Getopt.String ("sparse|preallocated", set_output_alloc), s_"Set output allocation mode"; @@ -390,7 +389,6 @@ read the man page virt-v2v(1). pr "input:ova\n"; pr "input:vmx\n"; pr "output:glance\n"; - pr "output:json\n"; pr "output:libvirt\n"; pr "output:local\n"; pr "output:null\n"; @@ -487,8 +485,7 @@ read the man page virt-v2v(1). | `Openstack -> (module Output_openstack.Openstack) | `RHV_Upload -> (module Output_rhv_upload.RHVUpload) | `RHV -> (module Output_rhv.RHV) - | `VDSM -> (module Output_vdsm.VDSM) - | `JSON -> (module Output_json.Json) in + | `VDSM -> (module Output_vdsm.VDSM) in let output_options = { Output.output_alloc = output_alloc; -- 2.35.1
Laszlo Ersek
2022-Apr-11 10:34 UTC
[Libguestfs] [PATCH v2v 0/2] output: Remove -o json mode [in stages]
On 04/11/22 12:11, Richard W.M. Jones wrote:> I'd like to remove the unused -o json mode. The implementation is > over-complicated and the only potential user (KubeVirt) isn't using it > now and would be better off with a proper -o kubevirt mode, which I'm > going to implement later. > > My plan would be to add the patches in two stages. The first patch, > which only removes the documentation but leaves the feature and test, > would be applied to stable branch virt-v2v 2.0. The second patch > would be go on the development branch 2.1 (which hasn't yet been > created). The first stable release without this feature would be 2.2.If the second patch goes on the 2.1 dev branch, then why wouldn't the 2.1 release include it? (IOW the 2.1 release would not have "-o json" any more.) I'm OK with the plan just don't understand how 2.2 is relevant.> For RHEL I'd probably put both patches in 9.1, even though we're > planning to ship virt-v2v 2.0.x there. It means there will be an > option/feature present in RHEL 9.0 which is removed in 9.1.I don't think "-o json" is used by anyone at the moment, so in practice it shouldn't become a regression. I'll look at the patches now. Thanks Laszlo